动手拆子集:pyftsubset
适合谁看:想把一款字体裁成只含页面用到的字、转成 WOFF2 自己部署的开发者。
先确认许可允许修改和网页使用,见《见《自托管网页字体的许可要点》。
准备
pyftsubset 是 fontTools 自带的子集工具。要输出 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 等。要指定保留哪些功能,用 --layout-features;要保留全部,用 --layout-features='*'。
注意事项
- 按页面文字裁,内容一变就缺字。 有用户输入、评论、搜索的地方,不要用固定子集,用分片方案(见下一页)。
- 记得标点和数字。 中文标点、全角空格、数字、常用符号都要包含在内。
- 改名。 开源字体有「保留字体名」时,裁过的字体按许可算修改版,
font-family和文件里的名字最好换掉,见《见《SIL 开放字体许可证(OFL)逐条读》。
参考资料
- fontTools 文档:subset 模块(含全部选项说明):https://fonttools.readthedocs.io/en/latest/subset/index.html
- fontTools 源码仓库:https://github.com/fonttools/fonttools
- Microsoft OpenType 规范:name 表编号:https://learn.microsoft.com/en-us/typography/opentype/spec/name#name-ids