Python获取字体文件所支持的字形

天城文的辅音音丛按照规则合写在一起为合字,所有的合写规则超过1000种,不同字体文件所支持的合写规则数量和种类不一样。我需要获取天城文字体文件支持的所有字形(glyph),以统计它所支持的合字字符。

在StackOverflow上找到了一些解决方案,最高赞的方法并不满足我的需求,因为它是根据Unicode码位来访问字形的,但Unicode中没有天城文合字的码位。上述方法用到了Python的fontTools库,为我提供了线索。

处理OpenType和TrueType字体文件的是fontTools的ffFont类,官方文档在这里TTFont对象有形如getGlyphXXXX()的接口函数,返回字形名称。我用的是getGlyphOrder()函数,因为它按照字形在字体文件中的顺序进行排序,方便比对。下面的代码打印字体文件中所有字形的名称,其中getGlyphID()函数返回字形在字体文件中的位置序号。

1
2
3
4
5
6
7
from fontTools import ttLib

tt = ttLib.TTFont("../fonts/Devanagari.ttf")

glyph_name_list = tt.getGlyphOrder()
for name in glyph_name_list:
print(tt.getGlyphID(name), name)

输出的部分内容如下,之间省略了很多行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0 .notdef
1 NULL
2 CR
3 space
4 nbspace
5 A
6 B
7 C
...
728 DoubleDanda
729 dShortA
730 dA
731 dCandraA
...
894 dKKa
895 dKKha
896 dKCa
897 dKJa
...
1384 dSiddhirastu
1385 dOmJain
1386 dOm
1387 flowerpunc

该字体文件的字形名称简洁明了,一看就知道是什么字符,而Windows下的Nirmala.ttf在字形命名上做得非常糟糕。各种文字的字体文件都会包含拉丁字母和其他常用的字符,所以开头是ABC字母。从第729个开始,字形名称以d开头,表明是天城文字形。前面的dShortAdA是单个字母,后面的dTtKadTtTtha一看就是辅音音丛,字形是合字。最后一个是flowerpunc,是像花儿一样的字形。总共有1387个字形,顺序和字体文件完全相符,见下图:

字体文件支持的所有字符

该字体库还有个getGlyphSet()接口,返回一个类似于字典(dict-like)的字形集(GlyphSet),将字形名称映射到字形对象上。字形对象有draw()方法,可以将字形绘制出来。由于我暂时没有这种需求,所以没有深究。