Что означает «uniE0A1», возвращаемое FT_Get_Glyph_Name? - PullRequest
0 голосов
/ 22 июня 2019

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

При попытке обернуть голову вокруг рендеринга текста, произвольного ввода и т. Д. Я наткнулся на эти странные символы, которые, как я понимаю, сообщают, что они связаны с кодовой точкой Unicode, но когда я проверяю со стороны Unicode, эта кодовая точка недействительно.

Например, используя шрифт "Hack", глиф с индексом 1437 является примером этих загадочных глифов, о том, как он выглядит, см. Ниже.

Вот некоторый демонстрационный код с использованием freetype-py оболочки Python freetype.

Во-первых, в качестве примера того, что выглядит правдоподобно и относится к> 99% глифов, давайте рассмотрим букву "A":

import numpy as np
import freetype as FT
import unicodedata

ff = FT.Face('/usr/share/fonts/truetype/Hack-Regular.ttf')
ff.set_char_size(12<<6)

ff.load_glyph(1425)
ff.get_glyph_name(1425)
# b'uni0041'

шестнадцатеричный 41 - это десятичное 65, которое является ascii / unicode для «A», и отображаемое растровое изображение также выглядит как «A».

np.array(ff.glyph.bitmap.buffer).reshape(-1,8)
# array([[  0,   0,  67, 255, 121,   0,   0,   0],
#        [  0,   0, 143, 213, 198,   0,   0,   0],
#        [  0,   0, 218,  85, 250,  21,   0,   0],
#        [  0,  38, 248,   9, 203,  95,   0,   0],
#        [  0, 115, 191,   0, 136, 171,   0,   0],
#        [  0, 191, 125,   0,  69, 242,   5,   0],
#        [ 15, 250, 252, 252, 252, 255,  68,   0],
#        [ 87, 231,   2,   0,   0, 178, 145,   0],
#        [162, 152,   0,   0,   0,  97, 221,   0]])
unicodedata.name(chr(0x0041))
# 'LATIN CAPITAL LETTER A'

Теперь давайте сделаем то же самое для индекса глифа 1437:

ff.load_glyph(1437)
ff.get_glyph_name(1437)
# b'uniE0A1'
np.array(ff.glyph.bitmap.buffer).reshape(-1,5)
# array([[ 56,  70,   0,   0,   0],
#        [112, 140,   0,   0,   0],
#        [112, 140,   0,   0,   0],
#        [112, 140,   0,   0,   0],
#        [112, 140,   0,   0,   0],
#        [112, 140,   0,   0,   0],
#        [105, 232, 224, 178,   0],
#        [  0, 168, 150,  40, 216],
#        [  0, 168, 241,  46, 216],
#        [  0, 168, 223, 124, 216],
#        [  0, 168, 131, 215, 216],
#        [  0, 168,  81, 212, 216],
#        [  0, 168,  84, 108, 216]])
unicodedata.name(chr(0xE0A1))
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ValueError: no such name

Итак, глиф называет себя "uniE0A1", но, как я уже сказал, у юникода там нет кодовой точки (я дважды проверил, и он не в UnicodeData.txt (я думаю, что версия 12)), и я не распознаю растровое изображение.

Этот вопрос слабо связан с Почему num_glyphs не соответствует количеству глифов, перечисленных FT_Get_First_Char / FT_Get_Next_Char , еще один пример того, что не складывается.

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Я только что установил hack-fonts-3.003 и проверил глиф, полученный из символа, созданного из кодовой точки U + E0A1:

latin capital letter L over latin capital letter N

Этот символ используется в качестве индикатора номера строки в приложениях с поддержкой Powerline . Поскольку персонаж в настоящее время живет в частной области использования, его значение не связано с его внешним видом. Другими словами, вы можете вычесть значение персонажа, только если вы уже знаете, что это такое, как он выглядит. Я знаю, что это такое (потому что я знаком с предметом), а вы (OP) - нет.

Следовательно, для решения этой проблемы существует предложение включить символы Powerline в собственно Unicode . Как только предложение будет принято, ожидайте переключения шрифтов и приложений с безымянного и бессмысленного U+E0A1 ‹› на U+2FE1 ‹⿡› \N{LINE NUMBER INDICATOR}.


uniE0A1 - идентификатор шрифта с неправильным именем, автор шрифта был ленивым или небрежным. Он должен называться line_number_indicator или иметь похожее значащее имя.

0 голосов
/ 22 июня 2019

Кодовая точка U + E0A1 находится в области частного использования.Шрифт может использовать его для пользовательских символов.

https://www.unicode.org/charts/PDF/UE000.pdf

...