Как мы можем получить юникод из идентификатора глифа в питоне?

Если у меня есть идентификаторы глифов, как показано ниже, как я могу получить от них юникод, язык - это python, над которым я работаю? Также я понимаю, что второе значение - это идентификатор глифа, но как мы называем первое значение и третье значение?

 (582, 'uni0246', 'LATIN CAPITAL LETTER E WITH STROKE'), (583, 'uni0247', 'LATIN SMALL LETTER E WITH STROKE'), (584, 'uni0248', 'LATIN CAPITAL LETTER J WITHSTROKE'), (585, 'uni0249', 'LATIN SMALL LETTER J WITH STROKE')

Пожалуйста, ответьте.

На самом деле я пытаюсь получить юникод из заданного файла ttf в python. Вот код:

 from fontTools.ttLib import TTFont
 from fontTools.unicode import Unicode
 from ttfquery import ttfgroups
 from fontTools.ttLib.tables import _c_m_a_p
 from itertools import chain

 ttfgroups.buildTable() 
 ttf = TTFont(sys.argv[1], 0, verbose=0, allowVID=0,
            ignoreDecompileErrors=True,
            fontNumber=-1)

 chars = chain.from_iterable([y + (Unicode[y[0]],) for y in x.cmap.items()] for x in ttf["cmap"].tables)
 print(list(chars))`

Этот код я получил только из stackoverflow, но он дает приведенный выше вывод, а не то, что мне нужно. Так может ли кто-нибудь сказать мне, как получить юникоды из файла ttf, или можно ли преобразовать глиф в юникод, будет ли он соответствовать фактическому юникоду?


person YepMe    schedule 19.03.2015    source источник
comment
Что это значит, Юникод? Фактический символ в строке? Код символа Unicode (U+....)?   -  person deceze♦    schedule 19.03.2015
comment
246 с основанием 16 (0x246 в Python) — это то же значение, что и 582. Я не проверял это конкретное значение, но предполагаю, что это так называемая кодовая точка символа, описанного как латинская заглавная буква E со штрихом. Это то, что вы спрашиваете?   -  person Ulrich Eckhardt    schedule 19.03.2015
comment
Что я пытаюсь спросить: 1) Является ли второе значение идентификатором глифа? Если нет, то каковы эти три значения, которые печатаются. 2) Если да, то возможно ли преобразовать его в соответствующее значение юникода. Если да, то как? 3) Если невозможно получить значение юникода из данного идентификатора глифа, то как мы можем получить юникод из данного файла ttf?   -  person YepMe    schedule 19.03.2015
comment
Каково значение Unicode глифа? Вы имеете в виду кодовую точку Unicode? Здесь важно понять, что вы имеете в виду! Вы добавляете путаницы, потому что существует не только стандарт Unicode, но и встроенный тип Python unicode, и вы импортировали объект Unicode из модуля fontTools.unicode. Тем не менее, один и тот же глиф может иметь несколько кодовых точек Unicode, и вы можете преобразовать числовую кодовую точку Unicode в строку Python unicode, используя unichr(), как показано ниже. Наконец, вы говорите, что приведенный выше вывод [это] не то, что мне нужно, но вы не упомянули, какой результат вы хотите.   -  person Ulrich Eckhardt    schedule 19.03.2015
comment
Извините, Ульрих, если я создал какую-то путаницу, я хочу получить кодовую точку Unicode для каждого символа, присутствующего в файле ttf, с использованием python, но мой приведенный выше код печатает (582, 'uni0246', 'ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА E С ШТРИХОМ') ни один из которых не является кодовой точкой Юникода.   -  person YepMe    schedule 19.03.2015
comment
Первое число — это кодовая точка Unicode в десятичном формате.   -  person Mark Tolonen    schedule 19.03.2015


Ответы (2)


Вы можете использовать первое поле: unichr(x[0]) или, что то же самое, второе поле. Затем вы удаляете часть «uni» ([3:]) и конвертируете ее в шестнадцатеричное значение 'Ɇ'e, а затем в символ. Конечно, первый способ быстрее и проще.

unichr(int(x[1][3:], 16)) #для первого показанного элемента возвращает 'Ɇ', для второго 'ɇ'

Если вы используете python3, chr вместо unichr.

person vermillon    schedule 19.03.2015
comment
Спасибо за комментарий, я отредактировал свой ответ. Не заметил тег python2. - person vermillon; 19.03.2015
comment
unichr(x[0]) проще. Это десятичное значение кодовой точки Unicode. - person Mark Tolonen; 19.03.2015
comment
Конечно! Не заметил этого. Обновление ответа снова. - person vermillon; 19.03.2015

Вот простой способ найти все символы Юникода в файле ttf.

chars = []
with TTFont('/path/to/ttf', 0, ignoreDecompileErrors=True) as ttf:
    for x in ttf["cmap"].tables:
        for (code, _) in x.cmap.items():
            chars.append(chr(code))
# now chars is a list of \uxxxx characters
print(chars)
person alijandro    schedule 26.10.2020