我的最终目标是创建从glyph_id
到unicode_chars
的映射。由于单个字形可以映射到许多有序的glyph_id --> uni_1, uni_2, uni_3 ...
,所以该映射将在某种程度上是unicode_characters
。
我正在寻找一些工具或库,最好是在python中,通过它我可以访问所有元信息,例如字体内的表格。
我也在寻找一些可靠的资源,通过它我可以理解将多个Unicode映射到字形的过程。
我知道harfbuzz之类的工具会在给定的Unicode字符串上生成(字形,位置)对。但是我不确定它是否相反。
感谢所有帮助。
答案 0 :(得分:0)
您可能应该检查fontTools Python库,该库包含使用字体所需的组件。
您感兴趣的字体表是“ cmap”表,而您想要的基本上是Unicode映射子表的反向映射(有几种子表可以映射Unicode;如果您不熟悉,这个概念,建议您参考OpenType specification了解更多信息)。基本上,您将获得Unicode到字形的映射,并将其反转。
fontTools实际上具有一个不错的功能,它将自动选择“最佳” cmap子表(它具有首选cmap子表类型的有序列表,并返回您打开的特定字体中的第一个可用)。这是使用该功能的示例:
from fontTools.ttLib import TTFont
from collections import defaultdict
font = TTFont('path/to/fontfile.ttf')
unicode_map = font.getBestCmap()
reverse_unicode_map = defaultdict(list)
for k, v in unicode_map.items():
reverse_unicode_map[v].append(k)
reverse_unicode_map
现在拥有字形(字形名称)到整数代码点列表的映射:
>>> reverse_unicode_map
defaultdict(<class 'list'>, {'.null': [0, 8, 29], 'nonmarkingreturn': [9, 13], 'space': [32], 'exclam': [33], 'quotedbl': [34], 'numbersign': [35], 'dollar': [36], 'percent': [37], 'quotesingle': [39], 'parenleft': [40], 'parenright': [41], 'asterisk': [42], 'plus': [43], 'comma': [44], 'hyphen': [45], 'period': [46], 'slash': [47], 'zero': [48], 'one': [49], 'two': [50], 'three': [51], 'four': [52], 'five': [53]})
您会看到有2个字形,“。null”和“ nonmarkingreturn”映射到多个Unicode。
如果需要将字形名称解析为字形 indices ,则可以使用font.getGlyphID()
方法(传入字形名称;该方法将返回相应的整数ID)。