跳转到主要内容

动手拆子集:pyftsubset

适合谁看:想把一款字体裁成只含页面用到的字、转成 WOFF2 自己部署的开发者。

先确认许可允许修改和网页使用,见《自托管网页字体的许可要点》。

准备

pyftsubset 是 fontTools 自带的子集工具[1][2]。要输出 WOFF2,还需要 brotli:

pip install fonttools brotli

最常用的三种用法

按一段文字裁: 适合标题、Logo 文字、活动页。

pyftsubset SourceHanSerifSC-Bold.otf \
  --text="春日限定 立即报名" \
  --flavor=woff2 \
  --output-file=title.woff2

按文字文件裁: 把页面上所有文字导出到一个文本文件。

pyftsubset font.ttf --text-file=chars.txt --flavor=woff2 --output-file=page.woff2

按码位范围裁: 例如只留基本拉丁字母和中日韩统一表意文字基本区。

pyftsubset font.ttf --unicodes="U+0020-007E,U+4E00-9FFF" --flavor=woff2 --output-file=cjk-basic.woff2

别把许可信息裁掉

pyftsubset 默认只保留字体名称表里编号 0 到 6 的记录,并且只保留英文的记录。许可说明(编号 13)和许可网址(编号 14)默认会被删掉,中文字体名也会被删掉。自己部署开源字体时,建议加上:

--name-IDs='*' --name-languages='*'

这样字体文件里仍然带着版权和许可信息。

排版功能

pyftsubset 默认保留一批常用的 OpenType 功能,包括竖排相关的 vert、vrt2 和标点挤压相关的 halt、vhal、palt、vpal、chws、vchw 等[3]。要指定保留哪些功能,用 --layout-features;要保留全部,用 --layout-features='*'。

注意事项

  • 按页面文字裁,内容一变就缺字。 有用户输入、评论、搜索的地方,不要用固定子集,用分片方案(见下一页)。
  • 记得标点和数字。 中文标点、全角空格、数字、常用符号都要包含在内。
  • 改名。 开源字体有「保留字体名」时,裁过的字体按许可算修改版,font-family 和文件里的名字最好换掉,见《SIL 开放字体许可证(OFL)逐条读》。
参考资料(3)
  1. fontTools subset 模块文档(英文),fontTools 项目
  2. fontTools 源代码仓库,GitHub:fonttools
  3. OpenType 规范:name 表编号,Microsoft