页面改完字体,刷新时先白一下,文字用系统默认字顶上来,过一两秒才换成设计稿里那款。手机网络下这个过程更久,有时干脆不换,一直显示兜底字体。打开开发者工具一看,字体文件正在下载,进度条走得像在加载一张大图。
问题不在服务器,在文件本身。一款覆盖两万多汉字的中文字体,全量文件常在五到十五兆之间,而一个页面真正用到的字,往往只有几百个。剩下那些字形,访问者一次也用不上,却要跟着下载。猫啃网收录 839 款免费中文字体,详情页拿到的都是全量包,直接挂上网页都会撞上同一堵墙。
一、子集化改的是字形表,不是字体功能
字体文件内部是一张映射表。 码位指向字形,字形指向轮廓数据,几万个码位对应几万套笔画。子集化就是拿一份字符清单,只保留清单里出现的那部分码位,其余连同轮廓一起丢掉。
裁完还是字体。 文件能装、能渲染、能加粗,只是遇到清单外的字没有字形可用,浏览器会按 font-family 的顺序回落到下一个字体。这不是报错,是一种静默替换。
体积下降是成比例的。 两万多字裁到八百字,文件常常落到几十 KB 到两百 KB。降的不只是字形数量,内部的索引表、轮廓压缩块也跟着缩小,所以实际压缩比比字数比例还要好一些。
裁得越贴近内容,省得越多。 按页面真实字符裁,一般比按“常用三千五百字”裁更小。代价是前者和内容绑定,后者更通用,改动时不必重做。
二、三种裁法,按内容稳定程度选
按页面字符裁。 把页面文案导出成纯文本,去重后生成字符清单。适合落地页、活动页这类上线后改动不多的页面,能把体积压到很低。
按常用字表裁。 用通用字表打底,再补上项目特有的字,比如品牌名、人名。适合内容持续更新的站点,新增文案多数落在常用字范围内,不会立刻缺字。
按 Unicode 区段裁。 只保留基本汉字区、常用标点、拉丁字母,一次性砍掉扩展区和生僻字。做法省事,但遇到人名地名里的生僻字就会露馅。
混着用也常见。 正文走常用字表版本,标题这类字符固定的部分单独按字符裁,两套文件分开加载。标题字数少,裁完常常只有十几 KB。
三、动手四步,一步别省
第一步,统计字符。 文案导出成纯文本后去重排序。中文标点、全角空格、数字、英文都要算进去,这些同样占码位,漏了就在页面上变成方框。
第二步,选工具。 命令行工具 fonttools 里的 pyftsubset 用得较多,一条命令可以指定输入文件、字符清单和输出格式。不熟悉命令行的,也有图形界面的子集工具,操作路径类似。
第三步,输出 woff2。 网页优先用 woff2,压缩率高于 ttf,主流浏览器都支持。工具能直接出 woff2 就直接出,只能出 ttf 的话再转一次。
第四步,验证缺字。 把生成的文件装上,打开一个包含全部清单字符的测试页,逐段看有没有方框。也可以把字符清单反向比对一遍,确认覆盖完整。
顺手配一行 font-display。 在 @font-face 里写 font-display: swap,让文字先用系统字体顶上,字体下载完再替换。首屏就不会出现长时间空白。
四、四个高频返工点
内容更新后忘了重裁。 新增文案里出现清单外的字,页面会静默回落到系统字体,同一段话里出现两种字形,肉眼能看出来。这是返工的头号来源,改版流程里要留一步重新生成。
只裁了正文,没裁字重。 每个字重是独立文件,Regular 裁了,Bold 还是全量,加粗的部分照样几兆。多个字重要分别处理,别只做一份。
标点被过滤掉了。 引号、破折号、省略号、间隔号在生成清单时经常被脚本当成噪声删掉,页面上就露出方框。清单里要显式保留一份标点字符。
以为裁完就能随便分发。 子集化只改体积,不改协议。把裁过的文件嵌进安装包或对外提供下载,仍然要看原字体的许可条件,这一步和裁不裁无关。
五、哪些字体适合动手裁
开源协议类阻力小。思源黑体 采用 OFL,允许修改与再分发,做子集化没有协议障碍;得意黑 同为 OFL,做斜向标题时字符集需求小,裁完更轻;素材集市智造黑 也是 OFL,骨架规整,适合界面与正文。
作者声明类先读原文。MiSans、鸿蒙黑体、阿里巴巴普惠体 都属于作者声明免费商用,改写和再分发是否被允许,要看声明本身写了什么,不能默认。
有一条通用规则别忘。 OFL 要求衍生版本更换字体名称。子集化后如果对外分发,文件名和内部的 name 表都要改,沿用原名属于违规。
授权说明
这里的“能用”,指字体文件可以在网页里正常加载并输出字形。核验按三步走。
第一步,确认字体全名。 一个系列常有多款、多个字重和多个地区版本,授权按具体文件声明。名字写错,查到的协议可能不是同一款。带 GB、简繁、VF 这类后缀的,与基础版不是同一份文件。
第二步,查协议类型。 常见几类:开源协议(SIL OFL、MIT、GPL)、作者声明免费商用、随包附带的免费商用声明,以及带保留字体名称条款的授权。开源协议文本公开可查,条件写在正文里;作者声明的范围由声明自身界定,不同作者写法差别很大。
第三步,核使用场景。 网页加载、印刷、视频通常都在允许范围内;把字体嵌进 App、电子书,或者做 Logo 商标注册时,要单独确认。子集化后的文件对外分发,也要归到“再分发”这一栏里看。
留凭证。 把字体全名、版本号、获取日期、许可页面截图和链接记在同一个文档里,和项目文件放在一起。字体更新后条款可能调整,有记录才好追溯。
常见问题(FAQ)
问:子集化之后字体还能正常安装使用吗?
能。子集化只是删掉用不到的字形,文件结构完整,装进系统后照常调用,只是显示清单外的字时会回落到其他字体。
问:只裁一次,以后一直用行不行?
内容稳定的页面可以。内容会持续更新的站点,建议留一份常用字表版本做兜底,再对固定板块做精确裁切,两者配合比反复重做省事。
问:裁完文件还是有一百多 KB,正常吗?
正常。汉字轮廓本身占空间,八百个字的子集落在几十到两百 KB 是常见区间。想再小,只能继续减少字符数,或者换字符集更小的字体。
问:会不会影响文字被搜索引擎收录?
不会。子集化改的是渲染用文件,页面里的文字仍然是正常文本,抓取和复制都不受影响。
小结
子集化是把全量字库裁成页面实际用到的那几百个字。做法上先统计字符,再用工具生成 woff2,配上 font-display: swap,最后验证一遍缺字。返工多半出在内容更新后忘记重裁、多字重只裁一份、标点被过滤这三处。真正做到位,还要把协议这一栏一起核清:确认全名、查清类型、核对场景,凭证留好再上线。
猫啃网

