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
(默认情况下我有它)。
我在便携式 OpenGL 应用程序上使用 Freetype 2.5.3
。
我的问题是我无法在我的 Windows 机器上获取 unicode,而我在基于 linux 的系统 (lubuntu, OSX, Android)
我使用的是著名的 arialuni.ttf
(23mb),所以我很确定它包含了所有内容。事实上,我在之前的 Windows 安装 (Win7) 中有此 工作 ,然后从另一个来源重新安装 Win7,现在 unicode 无法正常工作。
特别是当我绘制一个字符串时,只有拉丁语被渲染而 unicode 被跳过。我挖得更深,发现字符代码不是 wstring
中应有的字符代码。例如,我在 γ
这样的字符串中使用了一些希腊字母,我知道它应该有 947
.
我的引擎只是迭代 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
(默认情况下我有它)。