按特定的字形子集字体

9
我有一个14MB的TrueType字体文件,其中大部分是简体中文字符。
我想通过创建一个只包含HTML页面中特定字符的子集来减小字体文件的大小。
因此,理想情况下,我希望将一段文本传递给一个(Linux)程序,并基于其中包含的字符重新创建字体。
例如:
 ./magic-font-squisher input.tff "ABC123水小长"

或者

 ./magic-font-squisher input.tff /path/to/test.html

新字体只包含这9个字符。
2个回答

8
你可以通过编写 FontForge 的脚本来实现。这个方法可以行得通,但可能需要更聪明的方法或在包含脚本中使用。
#!/usr/bin/env fontforge
Open($1); # first param
SelectAll();
SelectFewer(0u41, 0u43, 0u31, 0u33); # a range
SelectFewer(0u6c34); # or a single codepoint
SelectFewer(0u5c0f);
SelectFewer(0u957f);
DetachAndRemoveGlyphs();
Save($2); # second param
Quit(0);

在运行之前,我必须定义FONTFORGE_LANGUAGE

FONTFORGE_LANGUAGE=ff ./squish source.ttf squished.ttf

2
较新的文档:介绍函数参考。另外请注意,SelectFewer(0u41, 0u43); 是范围 [0u41, 0u43],而 SelectFewer(0u41, 0u43, 0u31, 0u33); 是两个范围的并集,即 [0u41, 0u43][0u31, 0u33](答案有点不清楚)。此外,有人可能想通过命令 Reencode('compacted'); 来压缩字体。顺便说一下,感谢您提供的出色答案! - diralik

5

我曾使用过https://bitbucket.org/philip/font-optimizer/src

./subset.pl --chars="ABC 123 水小长" input.ttf output.ttf

这正是我想要的。

如何找到它

Google字体目录包含一个子集工具。 README上写道:

--string=: 仅为指定的字符串生成子集。用于创建菜单子集。通常我们使用Font Optimizer的subset.pl进行此操作。

寻找“Font Optimizer” 将您引导到一个演示站点,可让您测试该脚本。

还有一个分叉的GitHub存储库,其中有更好的文档。


2
subset.pl一直返回在Font/Subsetter.pm的第1496行,子例程条目中出现了宽字符。有什么想法吗? - snakeninny
1
最好的答案可能就是使用FontForge,因为它似乎是一个活跃的项目。然而,原始repo的github分支似乎已经被修补以解决这个问题,所以你应该能够使用它。我的唯一警告是它仍然会抛出许多弃用错误,所以最终也可能开始出现故障。 - pml
@terence-eden 这个答案根本不起作用。请查看 https://stackoverflow.com/questions/54564504/clear-font-ttf-from-unused-glyphs - KAMIKAZE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接