2

我正在为 Windows 开发一款用于学习的游戏(我正在学习 DirectX)。我希望它有 UTF 支持。

阅读这个问题,我了解到 windows 使用wchar_tUTF-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

那么,我能做些什么呢?我可以想到以下几点:

  1. 放弃UTF的想法;使用 ISO-8859-1 并开心(这是魔兽世界所做的,至少对于 enUS 版本)
  2. 将每一帧中的每一个字符串从 UTF-8 转换为 UTF-16(不过,我担心性能问题,考虑到它会为每个字符串每秒执行 60 次以上并且它是 O(N) 我很漂亮肯定会相当慢)
  3. 对于每个 lua 字符串,保留一个 UTF-16 副本;巨大的内存浪费,很难实现(当 UTF-16 字符串在 Lua 中更改时保持最新等)
4

4 回答 4

5

它也不使用 8859-1,它使用系统的本地代码页。您可以通过自己转换字符串来转换为 UTF16 并使用 DrawText()。如果您的类库没有任何支持,那么您可以使用MultiByteToWideChar()

于 2010-02-26T22:15:19.687 回答
2

我不会感到震惊的是 WoW 不使用 DirectX 文本绘制方法。拥有自己的自定义文本绘制解决方案可以让您在支持编码方面更加灵活。这不是太难。

于 2010-02-26T22:56:29.913 回答
2

您可以让 lua 将您的转换缓存为 UTF-16

utf16 = setmetatable ( {} , { __index = function ( t , k , v )
        local utf16str = my_conversion_func_to_utf16 ( v )
        rawset ( t , k , utf16str )
        return utf16str
    end } )

然后让你的所有函数只采用 utf16 字符串类型(可以是 lua 字符串或某种用户数据(可以是你的 wchar_t 数组))

不懂的可以多帮忙

于 2010-02-27T04:37:53.133 回答
1

í•œêµì–´/ì¡°ì„ ë§。我一直在星际争霸中看到这一点,因为它没有对 Unicode 的适当支持。

打好仗!使用 UTF-8。每帧都转换为 UTF-16(除非我懒得看的文档中提到了更好的方法)。不要担心这里的性能,直到它成为一个问题!

于 2010-02-26T22:16:09.217 回答