FreeType with unicode [ERROR]

时间:2014-03-06 19:45:58

标签: c++ text unicode freetype

我按照以下方式初始化FreeType:

if (FT_Init_FreeType(&ft)) {
        printf("couldn't init freetype\n");
        exit(1);
    }
    std::string fontPath = "D:/fonts/newscycle-bold.ttf";
    if (FT_New_Face(ft, fontPath.c_str(), 0, &face)) {
        printf("couldn't open font\n");
        exit(1);
    }

    FT_Select_Charmap(face, ft_encoding_unicode);
    FT_Set_Pixel_Sizes(face, 0, size);
    g = face->glyph; // declaration like FT_GlyphSlot g;

我得到的字形如下:

    // load the w_char into the face object
if (FT_Load_Char(face, c, FT_LOAD_RENDER))
    printf("freetype is unable to load char: %c\n", c); // this runs if error was occured

我使用wchar_t*wchar_t类型。

但我看到以下情况: enter image description here

4 个答案:

答案 0 :(得分:1)

我对unicode字符有同样的问题,最后我发现问题是从UTF8字符串转换为UTF16(wstring)。我使用mbstowcs函数进行转换,但像'€'这样的符号未按预期转换。它适用于我的方式是使用新的C ++ 11 std::wstring_convert类。试试这个:

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convert;
const std::wstring wideText = convert.from_bytes(_text);

现在将wideText字符串传递给FreeType。

答案 1 :(得分:1)

我想初始化一个包含宽字符的字符串,你需要像这样初始化它们:

wchar_t c = L'آ';
wchar_t w = _T('آ');
wchar_t *s = L"Hآ文";
wchar_t *q = _T("Hآ文");

但是如果要在运行时加载字符串,则必须将字符串文件转换为ut16或utf-32,方法是将字符串文件保存为utf-16或utf-32文件,或者转换为utf-8格式化字符串为带有函数的utf-16格式化字符串。

答案 2 :(得分:0)

这可能为时已晚,但我遇到了同样的问题。原因是您使用了错误的函数来加载字符/字形。

您所要做的就是将FT_Load_Char替换为FT_Load_Glyph

答案 3 :(得分:0)

也可能是您的字体没有您尝试显示的字形

我和日本人有同样的问题&#39;あえいおう&#39;并搜索了几天 - 只是发现我的字体只包含ASCII 字符集和一些西方集,但没有亚洲集

如果字形不在字体内,则会被......替换为

  • ...空方(见截图),或......
  • ...一个带有居中的2行十六进制字形标识的正方形

示例:Image: rendered 'あえいおう' + 1 errornous glyph

我用于此示例的字体 包含日语字符集,但不包含泰语/越南语字符集,因此& #39;为什么日语字符显示,而泰语/越南语字符 。 (虽然我不知道为什么它有时候是一个有字形ID的正方形,有时却没有它)

如果你看到那个方块,你就会知道带有borderd glyph-id的字形根本不存在于你的字体文件中。你必须使用unicode字体。

出于测试目的,您可能希望使用标准Windows字体中的Arial Unicode。

获取ARIALUNI.TTF(Arial Unicode):

  1. 打开“开始 - 菜单”(Windows-key)并输入:font
  2. 打开&#34;显示已安装的字体&#34;
  3. F3
  4. 的字体窗口搜索(Arial Uni)中
  5. 寻找Arial Unicode MS Standard
  6. 拖放它,例如到桌面(或任何其他地方)
  7. 将该字体用于unicode文本。