FreeType如何渲染像ääö这样的特殊字符?

Lar*_*ert 2 c++ opengl freetype

我坚持使用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
}
Run Code Online (Sandbox Code Playgroud)

加载字体,获取字形等基本上是有效的,但是'ü'不会被渲染.这是我的输出看起来像:

除

除"ü"之外的所有字符都会显示出来!

控制台输出

这最终会出现在我的控制台中,所以我猜我对字符串的迭代肯定是错的,因为'ü'被分成两个字符.我得到的最后两个字符的字形位图都是宽度和高度0.

我怎样才能解决这个问题?

Dan*_*lKO 6

精简版

阅读本文:http: //www.joelonsoftware.com/articles/Unicode.html

使用此:http: //www.pango.org/

长版

您似乎对文本表示和渲染有一些误解(您使用放弃软件"检查"文本输出显示它).幸运的是Joel在描述这个问题方面做得非常不错:http://www.joelonsoftware.com/articles/Unicode.html

FreeType能够解析True Type文件,并渲染存储在文件中的字形.它不是一个成熟的文本渲染引擎.您使用的字体可能甚至没有渲染所需字符所需的字形,您可能需要组合不同的字形以产生所需的输出.

当然,您不会自己实现整个Unicode渲染逻辑,这是一项艰巨的任务.如果你想在它上面抛出"text"并让它渲染,你必须使用更高级别的东西.至少HarfBuzz,或者其中的东西,比如Pango或Qt.在SDL_Pango库中可以看到有关如何使用Pango + FreeType的一个很好的示例.

  • 不确定为什么你认为需要Pango.`ü`可以表示为单个Unicode代码点,只要它们存在于字体中,FreeType就可以在没有帮助的情况下呈现Unicode代码点. (3认同)
  • @LarsEbert:`std :: wstring`? (3认同)
  • @MSalters AFAIK FreeType 不能进行 unicode 规范化,所以如果字体有“u”和重音作为分隔的字形,它不会为你加入它们。 (2认同)