我正在为 Windows 开发一款用于学习的游戏(我正在学习 DirectX)。我希望它有 UTF 支持。
阅读这个问题,我了解到 windows 使用wchar_t
UTF-16。我希望我的游戏支持 Lua 脚本,而Lua 不太喜欢 Unicode。它只是将字符串视为“字节流”;这对于 UTF-8 来说足够好,但 UTF-16 几乎不可能使用。
长话短说:windows 想要 UTF-16,lua 想要 UTF-8。
所以我想,让我们用普通的 UTF-8char*
和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 中更改时保持最新等)