fonttools для чтения данных cmap

фон:

используя fonttools, я хочу изменить символ, такой как " ل "(U+0644), до его начальной формы " ﻟ "(U+FEDF). Я могу сделать это в 4 шага:

  1. используя fonttools, сохраните данные шрифта как xml, а затем проанализируйте их

    font = TTFont(fontPath) font.saveXML("tempfont.xml")

  2. найдите имя, связанное с U + 0644, в таблице cmap (предположим, что это имя "isolam")

  3. в таблице GSUB найдите таблицу для "init" и найдите запись с атрибутом "in" для "isolam", а затем прочитайте его атрибут "out" (предположим, что это "initlam")

  4. и, наконец, поиск имени "initlam" в таблице Cmap и получить код точки

этот процесс очень медленный, и я думаю, что это потому, что XML-файл написан на жестком диске, а затем читается оттуда, а также есть много итераций по XML-файлу.

вопрос:

вместо сохранения XML-файла я сейчас пытаюсь напрямую работать с объектом TTFont. но у меня проблемы с чтением кодов из cmap.

font = TTFont(fontPath)
cmap = font['cmap'].tables

# there are 3 cmap tables for different platform in the font i am using, but
# for now i'm using cmap[2] which has platformId = 3 and is for windows.
print(cmap[2].data)

но результат кажется gibberish.it очень длинным, поэтому я просто покажу некоторые из них:

Ь '\ x00` \ x00 @ \ x00 \ x05 \ x00 \ x00 \ x00 + \ x00 / \ X009 \ x00: \ x00> \ x00 [\ x00] \ x00 {\ x00} \ x00 \ Xab \ x00 \ Xbb \

теперь я ожидал, что он вернет словарь с кодовыми точками в качестве ключей и имена в качестве значений, или, может быть, список кортежей.

так как я могу получить доступ к данным Cmap в понятном формате?

или как я могу получить имя глифа, учитывая соответствующую кодовую точку и наоборот?

0 ответов

Чтобы получить отображение фактического символа на имя в таблице cmap, вы можете сделать что-то вроде этого:

font = TTFont(fontPath)
ch_to_name = {} # key will be the codepoint in hex, value will be name

cmap = font["cmap"]
for ch, name in cmap.getBestCmap().items():
    ch_to_name["{:04X}".format(ch)] = name
Другие вопросы по тегам