字体子集化
字体子集化,是从完整字体里只保留实际用到的字、删掉其余字形,生成体积小得多的新字体的方法。一套中文字体常含 2 万多个汉字、十几 MB,活动页标题往往只用几十个字——本工具用 HarfBuzz 子集引擎在浏览器里完成字体压缩,实测 21.5MB 的宋体单款保留 3500 个汉字后约 1.4MB,只留十几个字不到 10KB,并输出 WOFF 与 @font-face 代码。字体与文字都不上传。
共 0 个不同的字
高级选项
如何使用字体子集化
把字体文件拖进虚线框或点击选择(支持 ttf / otf / ttc / woff,100MB 以内;ttc 字体集合可选其中一款)。
在文本框里粘贴要用到的文字,或点「数字 0-9」「英文标点」「中文标点」等按钮补字,也可以导入 txt / html / srt 等文本文件自动收字;下方实时显示字体里缺哪些字。
点「生成子集字体」,首次会加载约 650KB 的子集引擎,之后通常几百毫秒内出结果。
对比体积、看预览,下载 TTF/OTF 或 WOFF,并复制带 unicode-range 的 @font-face 代码直接用到网页里。
关于字体子集化的常见问题
- 字体子集化是什么?为什么能把中文字体压缩这么小
- 字体子集化就是只保留你实际用到的那些字的字形,其余字形全部删掉,再重新打包成一个合法的字体文件。中文字体之所以动辄十几 MB,是因为里面装了 2 万多个汉字的轮廓,而一个活动页标题、一组按钮文字往往只用几十个字。按本页实测,21.5MB 的宋体单款只留标题用的十几个字,产物不到 7KB;保留 3500 个汉字也只有约 1.4MB。字体压缩的幅度取决于你保留多少字,跟原字体多大关系不大。
- 字体子集化会上传我的字体文件吗
- 不会上传。子集引擎是 HarfBuzz 编译成的 WebAssembly 文件,第一次点「生成」时从本站下载到你的浏览器里运行,字体文件和你填的文字只在本机内存里处理,全程没有任何一个字节发往服务器,关掉页面就清空。页面也不把字体或文字存进浏览器的本地存储。所以未公开的品牌字体、有授权限制的商用字体都可以放心在这里做子集化。
- 字体文件太大怎么办?网页中文字体优化怎么做
- 网页中文字体优化通常四步一起做:第一步字体子集化,只留页面真正出现的字;第二步换成 WOFF 这类网页字体格式;第三步在 @font-face 里写 unicode-range,浏览器只在页面出现这些字时才下载字体;第四步加 font-display: swap,字体没下完先用系统字体显示,不会白屏等字。本工具一次生成子集 TTF/OTF、WOFF 和包含这些写法的 @font-face 代码,复制过去就能用。
- 子集化后的字体能商用吗?字体压缩会改变授权吗
- 不会改变授权。字体压缩只是删掉没用到的字形,原字体能不能商用、能不能嵌入网页,子集化之后还是一样;本工具也会把版权声明与许可信息原样保留在产物里。方正、汉仪等商用字体请先确认授权范围。如果字体的 fsType 嵌入权限标记写明「禁止子集化」,页面会显示警示,需要你勾选「已获得授权」后才能生成;标记为「禁止嵌入」的字体也会给出提醒。
- 字体子集化支持 woff2 吗
- 目前不支持读取或输出 woff2。woff2 用 Brotli 压缩并重新编码字形表,需要额外引入约 1MB 的编码器,我们会在单独的「TTF 转 WOFF2」工具里引入后再加进来。现在的输出是 TTF/OTF 加 WOFF:按本页实测,TrueType 轮廓的字体转成 WOFF 能再小约 25%~35%,PostScript(CFF)轮廓的 OTF 字体约小 10%~15%。如果手上只有 woff2,请找同款的 TTF 或 OTF 文件来子集化。
- 字体子集化和字蛛、Fontmin 有什么区别
- 三者做的是同一件事:按用到的字提取字体。区别在使用方式:字蛛(font-spider)和 Fontmin 需要先安装 Node.js 或桌面端,字蛛 2017 年后基本停更;本工具打开网页就能用,不安装任何东西,字体也不离开你的电脑。字蛛能扫描网页 HTML 自动收字,这里用「导入文本文件」实现同样效果——把 html、css、js 或字幕文件导进来,会自动去重收字。
- 小程序字体压缩可以用字体子集化吗
- 可以。小程序对包体积和网络字体都很敏感,正适合做字体子集化:把标题、按钮等要用特殊字体的文字粘进来,生成子集后把 TTF 或 WOFF 放到你的 HTTPS 静态资源地址,再用 wx.loadFontFace 加载。只留标题用字时体积通常只有几 KB 到几十 KB,加载几乎无感。注意小程序里没出现在子集里的字会回退成系统字体,新增文案后记得重新生成一次。
- 字体子集化后有些字变成系统字体怎么办
- 一般是两种情况。第一种是原字体本来就没有这个字:很多中文字体只收 GB2312 的 6763 个常用字,「堃」「喆」这类人名用字、繁体字或 emoji 并不在里面,子集化无法凭空造出字形,页面会回退成系统字体显示。本工具在你输入文字时就会实时列出「字体里缺哪些字」,生成前就能看到。第二种是后来往页面里加了新文案,而子集字体还是旧的那一份——子集只含生成时填进去的字,改了文案要把新字补进文本框重新生成一次,并替换 @font-face 代码。
- 手机浏览器上能做字体子集化吗
- 能。iOS Safari、安卓 Chrome 等手机浏览器都可以打开本页,从文件管理或网盘里选字体文件即可。受手机内存所限,交给子集引擎的单款字体要在 30MB 以内(ttc 集合会先抽出你选的那一款,所以集合文件本身可以更大)。字数很多又遇到失败时,可以减少文字数量或在高级选项里勾选「去掉 hinting」,体积和内存占用都会明显下降。
字体子集化能省多少:实测数据
下表是用本工具同一套引擎(HarfBuzz 子集引擎 1.6.2)在 Apple M 系列电脑上实测的结果,字体取自 macOS 自带字体,3500 字取 CJK 统一汉字区里字体有的前 3500 个字,十几个字的一档是一句标题「小鹿工具字体子集化压缩中文标题测试,。」。可以看到:保留的字数决定体积,原字体多大并不重要;WOFF 对 TrueType 轮廓更有效,对已经很紧凑的 CFF 轮廓收益小一些。
| 字体(轮廓) | 单款大小 | 保留字数 | TTF / OTF | WOFF |
|---|---|---|---|---|
| 宋体-简 粗体(TrueType) | 21.5 MB | 3500 | 1.35 MB | 937 KB |
| 宋体-简 粗体(TrueType) | 21.5 MB | 19 | 6.8 KB | 5.1 KB |
| 冬青黑体简体中文 W3(CFF) | 11.1 MB | 3500 | 1.18 MB | 1.04 MB |
| 冬青黑体简体中文 W3(CFF) | 11.1 MB | 19 | 8.3 KB | 7.0 KB |
| Arial Unicode MS(TrueType) | 22.2 MB | 3500 | 2.41 MB | 1.65 MB |
字体子集化后为什么字形数会比字数多
结果卡里的「字形数」经常比你保留的字数多几个,这是正常的。子集引擎会做「闭包」:一个字用到的其他字形会被一起带上——带变音符号的字母(如 Ä)常由 A 和两点组合而成,组合部件要留着;中文字体里的逗号、句号、括号通常还有一套竖排专用字形,排版特性规定横排、竖排各用各的;连字(如 fi)也会被保留。另外每个字体都必须有一个 .notdef 字形(缺字时显示的方框)。这些关联字形没有对应的字符,只是保证留下来的字显示正确。
字体子集 unicode-range 有什么用
@font-face 里的 unicode-range 告诉浏览器「这个字体只包含这些字」。浏览器据此只在页面真的出现这些字时才去下载字体文件,页面上字体里没有的字会自动回退到下一个字体(通常是系统字体),不会显示成方框。本工具生成的 unicode-range 是从子集产物的字符映射表里读回来的,保证与文件内容一致;如果你之后往页面里加了新文字,需要重新生成一次字体和这段代码。
字体子集化和字体压缩是一回事吗
同一件事在搜索框里有好几种问法:设计师多说「字体瘦身」「字体压缩」,前端开发者多说「字体子集」「font subset」,做海报和小程序的人常问「怎么只提取几个字」。下表把常见叫法和本页的对应步骤放在一起,不必分开找。
| 常见叫法 | 通常指什么 | 在本页对应哪一步 |
|---|---|---|
| 字体子集化、字体子集、在线字体子集化、font subset | 最正式的叫法:从完整字体里只保留一部分字符的字形,生成新字体 | 整个工具就是做这件事 |
| 字体压缩、中文字体压缩、字体瘦身 | 关注结果:字体文件变小。中文字体体积大,中文字体压缩的需求最多 | 生成后看结果卡里的体积对比 |
| ttf 字体压缩、otf 字体压缩、ttf 转 woff | 按文件格式来问:TrueType 的 ttf、PostScript 轮廓的 otf,或想要网页用的 woff | 上传 ttf / otf,结果同时给出同格式子集与 WOFF |
| 按需提取字体、字体提取指定文字 | 强调只要这几个字,常见于海报、H5 活动页、小程序标题 | 在文本框粘贴文字,或导入文本文件自动收字 |
| unicode-range 生成、font-face 生成 | 前端要的那段 CSS:声明字体文件和它覆盖的字符范围 | 结果卡底部的 @font-face 代码,一键复制 |
| 字蛛替代、Fontmin 替代 | 用过这两个 Node.js 工具,想找免安装的在线版本 | 打开网页即用;用导入 html 文件代替扫描网页 |
英文语境下这件事通常叫 font subset 或 font subsetting,做这件事的程序叫 subsetter,比如 Python 的 fonttools 自带的 pyftsubset 和本页用的 HarfBuzz hb-subset;搜 subset font、web font optimization 找到的基本是同一件事,只是多数需要命令行,本页把它放进了浏览器。