2014-03-06 92 views
0

我初始化的FreeType如下:的FreeType使用Unicode [错误]

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

+2

你期望看到什么?可以从你发布的代码中推断出来吗? –

回答

0

我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。

0

这可能太晚了,但我有同样的问题。原因是你使用了错误的函数来加载字符/字形。

您只需要将FT_Load_Char替换为FT_Load_Glyph即可。

0

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

我有同样的问题与日本字符“あえいおう”,并寻找天 - 才发现,我的字体也只包含ASCII字符集和一些西方集,但没有一个亚洲台

如果雕文是不是字体内,它就会被取代或者...

  • ...空方(看你的截图),或...
  • ...一具有位于中心的2内衬的十六进制字形-编号方

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

我用于该实施例的字体包含日文字符集,但不包含泰国/越南套,所以这就是为什么日本字符显示,而泰国/越南字符不是。 (虽然我不知道为什么它有时候是一个带有字形标识的正方形,有时却没有它)

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

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

得到ARIALUNI。TTF(宋体的Unicode):

  1. 打开开始菜单(Windows-key),然后键入:font
  2. 打开 “查看已安装的字体”
  3. 在字体窗口搜索(F3)为Arial Uni
  4. 查找Arial Unicode MS Standard
  5. 拖放它,例如到桌面(或任何其他地方)

将该字体用于unicode文本。

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格式的字符串。