【发布时间】:2011-01-21 15:48:02
【问题描述】:
我正在为 Windows 开发一款用于学习的游戏(我正在学习 DirectX)。我希望它支持 UTF。
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。
所以我想,让我们只使用普通的char* 和string 的UTF-8! .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) I '我很确定它会相当慢)
- 为每个 lua 字符串保留一个 UTF-16 副本;巨大的内存浪费,很难实现(当 UTF-16 字符串在 Lua 中发生变化时保持最新等)
【问题讨论】:
-
您需要先将 UTF-8 char*(或 std::string)转换为宽字符串,然后才能将其与 Windows API 一起使用。幸运的是,API 包含一个函数,但我不记得它叫什么。
-
为什么不能将所有字符串都保存为 UTF-16 格式?无论如何,您都希望在资源中的代码中保留字符串,对吗?
-
@John:这些可能是在 Lua 脚本中生成的字符串(因此超出了基础程序的控制范围)。
标签: c++ windows encoding lua utf