有谁知道为什么带有FreeType的HarfBuzz只是呈现“ ??? ???? ????”

时间:2019-03-28 08:54:31

标签: c++ unicode utf-8 freetype harfbuzz

我已经编译了这个HarfBuzz示例,而我得到的渲染效果只是“ ???? ???? ?????????”。

我正在编译的示例是这个https://github.com/tangrams/harfbuzz-example

输出应该类似于示例的github页面上显示的内容,但我只是得到“ ???? ??? ????”用于所有不同的文本。

这是程序的输出,因此尽管这些名称看起来相当通用,但似乎可以正确加载示例随附的字体。

> 0: DejaVu Serif Book unic plat=0 id=3
> 1: DejaVu Serif Book unic plat=0 id=4
> 2: DejaVu Serif Book armn plat=1 id=0
> 3: DejaVu Serif Book unic plat=3 id=1
> 4: DejaVu Serif Book unic plat=3 id=10
> 0: Source Sans Pro Regular unic plat=0 id=3
> 1: Source Sans Pro Regular armn plat=1 id=0
> 2: Source Sans Pro Regular unic plat=3 id=1
> 3: Source Sans Pro Regular ADOB plat=7 id=0
> 0: AR PL New Sung Regular unic plat=0 id=3
> 1: AR PL New Sung Regular armn plat=1 id=0
> 2: AR PL New Sung Regular unic plat=3 id=1
> ex 0 string min_x=3 max_x=420 min_y=-1 max_y=36 bbox 417x37 boffs 36,3
> ex 0 origin 20,50 bbox l=23 r=440 t=14 b=51
> ex 1 string min_x=1 max_x=356 min_y=0 max_y=34 bbox 355x34 boffs 34,1
> ex 1 origin 425,125 bbox l=426 r=781 t=91 b=125
> ex 2 string min_x=-10 max_x=12 min_y=-250 max_y=-4 bbox 22x246 boffs -10,-4
> ex 2 origin 389,200 bbox l=379 r=401 t=204 b=450

这些是它尝试呈现的字符串:

const char *texts[NUM_EXAMPLES] = {
  "Ленивый рыжий кот",
  "كسول الزنجبيل القط",
  "懶惰的姜貓",
}; 

如果我将字符串更改为英文字符,它们可以正常显示,这使我认为字体不包含正确的语言,但是据我所知,它正在加载示例随附的字体,而我做到了尝试将阿拉伯字体更改为我被告知绝对包含阿拉伯字体的字体。

/* Load our fonts */
FT_Face ft_face[NUM_EXAMPLES];
assert(!FT_New_Face(ft_library, "fonts/DejaVuSerif.ttf", 0, &ft_face[ENGLISH]));
assert(!FT_Set_Char_Size(ft_face[ENGLISH], 0, ptSize, device_hdpi, device_vdpi));
ftfdump(ft_face[ENGLISH]); // wonderful world of encodings ...
force_ucs2_charmap(ft_face[ENGLISH]); // which we ignore.

assert(!FT_New_Face(ft_library, "fonts/SourceSansPro-Regular.otf", 0, &ft_face[ARABIC]));
assert(!FT_Set_Char_Size(ft_face[ARABIC], 0, ptSize, device_hdpi, device_vdpi));
ftfdump(ft_face[ARABIC]);
force_ucs2_charmap(ft_face[ARABIC]);

assert(!FT_New_Face(ft_library, "fonts/fireflysung-1.3.0/fireflysung.ttf", 0, &ft_face[CHINESE]));
assert(!FT_Set_Char_Size(ft_face[CHINESE], 0, ptSize, device_hdpi, device_vdpi));
ftfdump(ft_face[CHINESE]);
force_ucs2_charmap(ft_face[CHINESE]);

我正在使用C ++ 17进行编译。我已经读过了,以防有人提及:https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

有人知道我为什么要问问吗?是否需要启用UTF-8的编译器设置?编译器是否有可能剥离UTF-8字符串?

谢谢!

1 个答案:

答案 0 :(得分:0)

是的,有一个编译器选项/ utf-8 (MSVC)