Вероятно, вам следует проверить библиотеку Python fontTools , в которой есть компоненты, необходимые для работы со шрифтами.
Таблица шрифтов, которая вас интересует, - это таблица 'cmap', и вам нужно, в основном, обратное отображение подтаблицы отображения Unicode (есть несколько видов подтаблиц, которые могут отображать Unicodes; если вы не знакомы с В этой концепции я рекомендую проверить спецификацию OpenType для получения дополнительной информации). По сути, вы получаете отображение Unicode-to-glyph и полностью изменяете это.
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.
Если вам нужно преобразовать имена глифов в глифы indexes , вы можете использовать метод font.getGlyphID()
(передать имя глифа; он вернет соответствующий целочисленный идентификатор).