FT_Get_Glyph_Name返回的“ uniE0A1”是什么意思?

时间:2019-06-22 19:52:33

标签: python unicode freetype freetype2 freetype-py

这可能是我不了解一些基本知识的结果,但是我确实可以提供一些帮助,所以就去了。

在尝试围绕文本呈现,freetype等缠绕我的头时,我遇到了那些奇怪的字形,当我不理解它时,它们报告自己与unicode代码点相关联,但是当我从unicode方面进行检查时,该代码点无效。

例如,使用字体“ Hack”在索引1437处的标志符号就是这些神秘标志符号的示例,请参见下面的外观。

以下是使用freetype-py的{​​{1}} python包装器的一些演示代码。

首先,作为一个看起来合理且适用于99%以上字形的示例,让我们看一下字母freetype

"A"

十六进制41是十进制65,它是'A'的ASCII / Unicode,并且渲染的位图也看起来是'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'

现在让我们对字形索引1437做同样的事情:

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'

因此,字形将其称为“ uniE0A1”,但是正如我所说的,unicode那里没有代码点(我仔细检查了一下,发现它不在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 中(我认为是12版)),我无法识别位图。

这个问题与Why does num_glyphs not match the number of glyphs enumerated by FT_Get_First_Char / FT_Get_Next_Char松散相关,{{3}}是另一个未加总的例子。

2 个答案:

答案 0 :(得分:0)

代码点U + E0A1位于“专用区域”中。字体可以将其用于自定义字符。

demo

答案 1 :(得分:0)

我刚刚安装了hack-fonts-3.003并检查了由代码点U + E0A1制成的字符产生的字形:

latin capital letter L over latin capital letter N

此字符在powerline enabled applications中用作行号指示符。由于角色当前居住在私人使用区域中,因此其含义与外观无关。换句话说,如果您已经从字符的外观中知道了字符的含义,则只能推断出字符的含义。我知道它是什么(因为我对这个主题很熟悉),而你(OP)则不知道。

因此,为了解决该问题,存在proposal to include powerline characters into Unicode proper。提案通过后,希望字体和应用程序从无名无意义的U+E0A1 ‹›切换到U+2FE1 ‹⿡› \N{LINE NUMBER INDICATOR}


uniE0A1是字体中的一个错误命名的标识符,字体作者是懒惰或粗心的。应该将其命名为line_number_indicator或类似的有意义的名称。