我正在开发一个用于学习目的的Windows游戏(我正在学习DirectX)。我希望它有UTF支持。Windows游戏:UTF-8,UTF-16,DirectX和Lua
Reading this question我知道windows使用wchar_t
,它是UTF-16。我希望我的游戏拥有Lua脚本支持,以及Lua doesn't really like Unicode much ..它只是将字符串视为“字节流”;这对于UTF-8来说足够好,但UTF-16几乎不可能使用。
长话短说:windows想要UTF-16,lua想要UTF-8。
所以我想,我们只需使用UTF-8与普通的char*
和string
! .length()
会搞砸但谁在乎?但它不起作用:
const char test_utf8[] = { 111, 108, 0xc3, 0xa9, 0 }; // UTF-8 for olè
mFont->DrawTextA(0, test_utf8, -1, &R, DT_NOCLIP, BLACK);
/* DrawText is a Direct3d function to, well, draw text.
* It's like MessageBox: it is a define to either DrawTextA
* or DrawTextW, depending if unicode is defined or not. Here
* we will use DrawTextA, since we are passing a normal char*. */
这打印olé
。换句话说,它似乎并未使用UTF-8,而是ISO-8859-1。
那么,我该怎么办?我可以想到以下几点:
- 放弃UTF的想法;使用ISO-8859-1并且很开心(这是魔兽世界的功能,至少对于enUS版本来说)
- 将每一个单一字符串从UTF-8转换为UTF-16(我很担心性能问题,但考虑到它会做每秒60+次,每个字符串,它是O(N)我很确定它会相当缓慢)
- 对于每个lua字符串保持一个UTF-16副本;内存巨大的浪费,很难实现(保持UTF-16字符串的最新的,当他们在Lua变化等)
你需要的UTF-8字符*(或std ::字符串)成宽字符串转换为使用它之前, Windows API。幸运的是,API包含一个函数,但我不记得它是什么。 – Tronic 2010-02-26 22:14:15
为什么你不能以UTF-16格式保存所有的字符串?无论如何,你想在代码中保留字符串,对吗? – 2010-02-26 22:20:50
@John:这些可能是在Lua脚本中生成的字符串(因此超出了基本程序的控制范围)。 – Amber 2010-02-26 22:34:48