c++ - FreeType 如何呈现 ü ä ö 等特殊字符?

标签 c++ opengl freetype

我被困在使用 FreeType 渲染文本。尤其是非 ascii 字符让我很头疼。经过一些尝试和错误后,我设法呈现了一些文本,但我的变音符号没有显示:

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
}

加载字体、获取字形等基本上可以正常工作,但不会呈现“ü”。这就是我的输出:

All characters except the 'ü' get displayed!

显示除“ü”以外的所有字符!

The console output

这最终出现在我的控制台中,所以我猜想我对字符串的迭代一定有问题,因为 'ü' 被分成了两个字符。我为最后两个字符获得的字形位图的宽度和高度均为 0。

我该如何解决这个问题?

最佳答案

精简版

读这个: http://www.joelonsoftware.com/articles/Unicode.html

使用这个: http://www.pango.org/

长版

您似乎对一般的文本表示和呈现有一些误解(您使用废弃软件来“检查”文本输出表明了这一点)。幸运的是,乔尔在描述问题方面做得相当不错:http://www.joelonsoftware.com/articles/Unicode.html

FreeType 能够解析 True Type 文件,并渲染存储在文件中的字形。它不是一个成熟的文本渲染引擎。您使用的字体可能甚至没有呈现所需字符所需的字形,您可能 need to combine different glyphs以产生所需的输出。

当然,您不会自己实现整个 Unicode 呈现逻辑,这是一项艰巨的任务。如果你只想向它抛出“文本”并让它呈现,你必须使用更高级别的东西。至少是 HarfBuzz,或者在它之上的东西,比如 Pango 或 Qt。关于如何使用 Pango+FreeType 的一个很好的例子可以在 SDL_Pango library 中看到。 .

关于c++ - FreeType 如何呈现 ü ä ö 等特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19176064/

相关文章:

fonts - 如何使用 FreeType 确定字体中没有字形的所有代码点?

windows - 在带有 Qt5 的 Windows 上使用 FreeType

python - 由于 freetype,在 OS X 10.11 上将 matplotlib 升级到 1.5 失败

javascript - dyld : lazy symbol binding failed, opencv

c++ - 重载 += 运算符时出现无效操作数错误

c++ - OpenGL 局部绘图

c++ - 当我在 glTexImage2D 中选择与在着色器中采样不同的内部格式时,情况会怎样?

c++ - C++中声明和定义分开的优点和缺点是什么?

C++ 模板元编程,成员变量的数量?

c++ - 使用现代 OpenGL 进行导航的 SDL 键盘和鼠标事件