Есть ли какой-нибудь инструмент Python или программный инструмент, с помощью которого я могу получить доступ ко всем компонентам и таблицам внутри шрифтов? - PullRequest
0 голосов
/ 02 апреля 2019

Моя конечная цель - создать отображение от glyph_id до unicode_chars.Это отображение будет иметь некоторый порядок glyph_id --> uni_1, uni_2, uni_3 ..., так как один глиф может быть сопоставлен со многими упорядоченными unicode_characters.

Я ищу какой-нибудь инструмент или библиотеку, предпочтительно на python, через которую я могу получить доступ ко всем метамфетаминам.-информацию, такую ​​как таблица внутри шрифтов.

Кроме того, я ищу какой-то твердый источник, через который я могу понять процесс отображения нескольких Unicode на глифы.

Я знаю, что такие инструменты, как harfbuzzсгенерировать (глиф, положение) пару по заданной строке Юникода.Но я не уверен, делает ли это наоборот или нет.

Спасибо за помощь любого рода.

1 Ответ

1 голос
/ 04 апреля 2019

Вероятно, вам следует проверить библиотеку 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() (передать имя глифа; он вернет соответствующий целочисленный идентификатор).

...