我坚持使用FreeType渲染文本。特别是非ascii chars让我头疼。经过一些试验和错误,我设法渲染了一些文字,但我的变音符号没有显示:
std::string text = "Hauptmenü";
for(std::string::iterator it = text.begin(); it != text.end(); ++it) {
std::cout << *it;
FT_Face face = loadFace(faceName);
FT_Set_Pixel_Sizes(face, 0, fontSize);
if(FT_Load_Char(face, *it, FT_LOAD_DEFAULT)) {
std::cout << "Could not load character '" << character << "'" << std::endl;
}
FT_Get_Glyph(face->glyph, &glyph);
FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
//render the glyphs to screen and so on
}
加载字体,获取字形等基本上可以正常工作,但不会渲染“ü”。这就是我的输出:
显示除“ü”以外的所有字符!
这最终会出现在我的控制台中,所以我想我对字符串的迭代一定是错的,因为'ü'被分成两个字符。我得到的最后两个字符的字形位图都是宽度和高度0。
我该如何解决这个问题?
答案 0 :(得分:6)
阅读本文: http://www.joelonsoftware.com/articles/Unicode.html
您似乎对文本表示和渲染有一些误解(您使用放弃软件来“检查”文本输出显示它)。幸运的是乔尔在描述问题方面做得非常不错:http://www.joelonsoftware.com/articles/Unicode.html
FreeType能够解析True Type文件,并渲染存储在文件中的字形。它不是一个成熟的文本渲染引擎。您使用的字体可能甚至没有渲染所需字符所需的字形,您可以need to combine different glyphs生成所需的输出。
当然,您不会自己实现整个Unicode渲染逻辑,这是一项艰巨的任务。如果你想在它上面抛出“text”并让它渲染,你必须使用更高级别的东西。至少HarfBuzz,或者其中的东西,比如Pango或Qt。关于如何使用Pango + FreeType的一个很好的例子可以在SDL_Pango library中找到。
答案 1 :(得分:0)
您的问题是,并非所有字符都可以用单个字节表示。大多数国际字符(如ü)需要两个(或更多)。您的字符串基本上是一个字符数组,不适合一个字节的字符将被解释为两个字符。
一种解决方案是使用std :: wstring,它基本上是wchar_t的数组。您的代码将变为:
std::wstring text = L"Hauptmenü";
for(std::wstring::iterator it = text.begin(); it != text.end(); ++it) {
std::wcout << *it;
FT_Face face = loadFace(faceName);
FT_Set_Pixel_Sizes(face, 0, fontSize);
if(FT_Load_Char(face, *it, FT_LOAD_DEFAULT)) {
std::wcout << L"Could not load character '" << character << L"'" << std::endl;
}
FT_Get_Glyph(face->glyph, &glyph);
FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
//render the glyphs to screen and so on
}
除此之外,还有很多the article链接到DanielKO是一个很好的开始。