FreeType 中的 Unicode 问题

6

我有一个解析XML的实现,其中包括维基百科主页的位置和字符串等信息。解析过程使用rapidxml完成,之后使用http://utfcpp.sourceforge.net/将字符串从UTF-8转换为UTF-32编码。然后,该UTF-32编码用于freetype的相关操作:

unsigned long c = FT_Get_Char_Index(face,*p);
FT_Load_Glyph(face,c,FT_LOAD_RENDER);

*p是UTF-32字符代码,然后在OpenGL中呈现该字形。

我似乎无法使西里尔字符正常工作,也不能使任何中文、日文或越南文正常工作,我确定*p对应正确的代码,并且我会感激您能给我任何指针。

对于这些字体,使用Microsoft的arial.ttf字体,从Arch Linux包中获取,从我在字体查看程序中看到的情况来看,它应该包含我想要的字符。

2个回答

8

我有两个建议:

首先,请确认您是否调用了FT_Select_Charmap以指定使用Unicode编码。

FT_Select_Charmap(face , ft_encoding_unicode);

其次,并非所有的Arial字体都包含所有的字符,有些字体查看器(至少在Windows上)会自动替换来自不同字体的字形,这可能会导致错误。如果可能,请尝试使用ArialUni.ttf


1
谢谢您的建议!使用FT_Select_Charmap没有产生任何不同的结果,我猜想Unicode是freetype的默认设置?您能推荐一些包含我需要字符的免费字体吗? - Jonathan Gustafsson
1
关于字体问题,我建议从这里开始:http://en.wikipedia.org/wiki/Unicode_typeface。 另外一个需要检查的是在调用 FT_Get_Char_Index 之前设置断点并检查你传递了什么代码点。也许你在使用 rapidxml 或 utfcpp 时出现了 bug。 - Roddy
2
你能否尝试构建一个最小的失败示例?`FT_Library library; FT_Face face; FT_Init_FreeType(&library); FT_New_Face(library,"monofont.ttf",0,&face); FT_Get_Char_Index(face,0x43f);` - 但是在每种情况下都要检查错误返回! - Roddy
2
我提交了自己的答案,感谢帮助,它指导我找到了错误。是的,这个最小化构建起作用了。 - Jonathan Gustafsson
1
@JonathanGustafsson 好的,谢谢您的快速回答!你最终解决了这个问题吗?我现在也遇到了使用Arial字体的同样的问题。如果我使用FTGL,它可以正常工作,但我直接使用FreeType就会出现问题。 - AzP
显示剩余4条评论

2

加载字体后不要忘记设置字体大小。

FT_Error err =  FT_Set_Pixel_Sizes(face, (width), (height));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接