Windows 上的自由类型 unicode

Freetype unicode on Windows

我在便携式 OpenGL 应用程序上使用 Freetype 2.5.3

我的问题是我无法在我的 Windows 机器上获取 unicode,而我在基于 linux 的系统 (lubuntu, OSX, Android)

我使用的是著名的 arialuni.ttf (23mb),所以我很确定它包含了所有内容。事实上,我在之前的 Windows 安装 (Win7) 中有此 工作 ,然后从另一个来源重新安装 Win7,现在 unicode 无法正常工作。

特别是当我绘制一个字符串时,只有拉丁语被渲染而 unicode 被跳过。我挖得更深,发现字符代码不是 wstring 中应有的字符代码。例如,我在 γ 这样的字符串中使用了一些希腊字母,我知道它应该有 947.

code point

我的引擎只是迭代 wstring 个字符并将上面的代码点驱动到另一个包含纹理坐标的向量,这样我就可以绘制字形了。

问题是在我的 Windows 7 机器上,wstring 没有给我 947 一个 γ,而是给我一个 179。此外,Ά returns 的字符作为 206 代码 (??) 的 2 个字符,而不是 902.

之一

这就像简单地迭代一个wstring,比如:

for(size_t c=0,sz=wtext.size();c<sz;c++) {
   uint32_t ch = wtext[c];   // code point
   ...
}

这只发生在我新安装的 Win7 上;它之前在另一个 Win7 系统以及我所有的 linux 机器上工作。现在这个坏了,我的XP虚拟机也坏了。

我没有使用任何宽格式函数,就像:

wstring wtext = L"blΆh";

此外,我可以看到我的字形在我的 OpenGL 纹理中正确呈现,所以也不是字体问题。我的字体生成器使用 ~900-950 代码点的希腊范围来收集字形。

我用这个添加了每种语言的代码点:

FT_UInt charcode;
FT_ULong character = FT_Get_First_Char(face, &charcode);
do {
   character = FT_Get_Next_Char(face, character, &charcode);
   ...
} while(charcode);

不知道为什么,但我通过将文件保存为 UTF-8 BOM 而修复了它,而不是 UTF-8(默认情况下我有它)。