Python获取字体文件所支持的字形
天城文的辅音音丛按照规则合写在一起为合字,所有的合写规则超过1000种,不同字体文件所支持的合写规则数量和种类不一样。我需要获取天城文字体文件支持的所有字形(glyph),以统计它所支持的合字字符。
在StackOverflow上找到了一些解决方案,最高赞的方法并不满足我的需求,因为它是根据Unicode码位来访问字形的,但Unicode中没有天城文合字的码位。上述方法用到了Python的fontTools库,为我提供了线索。
处理OpenType和TrueType字体文件的是fontTools的ffFont
类,官方文档在这里。TTFont
对象有形如getGlyphXXXX()
的接口函数,返回字形名称。我用的是getGlyphOrder()
函数,因为它按照字形在字体文件中的顺序进行排序,方便比对。下面的代码打印字体文件中所有字形的名称,其中getGlyphID()
函数返回字形在字体文件中的位置序号。
1 | from fontTools import ttLib |
输出的部分内容如下,之间省略了很多行:
1 | 0 .notdef |
该字体文件的字形名称简洁明了,一看就知道是什么字符,而Windows下的Nirmala.ttf
在字形命名上做得非常糟糕。各种文字的字体文件都会包含拉丁字母和其他常用的字符,所以开头是ABC
字母。从第729个开始,字形名称以d
开头,表明是天城文字形。前面的dShortA
、dA
是单个字母,后面的dTtKa
、dTtTtha
一看就是辅音音丛,字形是合字。最后一个是flowerpunc
,是像花儿一样的字形。总共有1387个字形,顺序和字体文件完全相符,见下图:
该字体库还有个getGlyphSet()
接口,返回一个类似于字典(dict-like)的字形集(GlyphSet),将字形名称映射到字形对象上。字形对象有draw()
方法,可以将字形绘制出来。由于我暂时没有这种需求,所以没有深究。