Windows游戏:UTF-8、UTF-16、DirectX和Lua

我正在开发一个Windows游戏来学习(我正在学习DirectX),我想让它支持UTF。

通过阅读这个问题,我了解到Windows使用 wchar_t,它是UTF-16。我想要我的游戏支持Lua脚本,并且Lua不太喜欢Unicode。它只是将字符串视为“字节流”;这对于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是一个Direct3d函数,用于绘制文本。 它类似于MessageBox:
 * 它是一个定义为DrawTextA或DrawTextW,取决于是否定义了Unicode。
 * 这里我们将使用DrawTextA,因为我们传递了普通char *。*/

这将打印出olé。换句话说,它似乎并没有使用UTF-8,而是使用ISO-8859-1

那我该怎么办呢?我可以考虑以下几点:

  1. 放弃UTF的想法;使用ISO-8859-1并感到高兴(这至少是World of Warcraft的enUS版本所做的)
  2. 在每个帧中将每个字符串从UTF-8转换为UTF-16(我担心性能问题,因为它将对每个字符串每秒执行60次以上,并且它是O(N),我非常确定它会相当缓慢)
  3. 对于每个Lua字符串保留一个UTF-16副本;浪费大量内存,难以实现(在Lua中更改时保持UTF-16字符串最新等)

原文链接 https://stackoverflow.com/questions/2345191

点赞
stackoverflow用户17034
stackoverflow用户17034

它也不使用8859-1,而是使用您系统的本地代码页。您可以通过自行转换字符串将其转换为UTF16并使用DrawText()。如果您的类库没有任何支持,则可以使用[MultiByteToWideChar()] (http://msdn.microsoft.com/en-us/library/dd319072%28VS.85%29.aspx)。

2010-02-26 22:15:19
stackoverflow用户149391
stackoverflow用户149391
将下面翻译成中文并且保留原本的 markdown 格式,
한국어/ì¡°ì„ ë§. 在星际争霸中我经常发现这个问题,因为它不支持Unicode。

要做好UTF-8。每一帧都要转换为UTF-16(除非有更好的方法在文档中提到,但我太懒了不想去看)。在性能不成问题之前不要过分担心性能问题!
2010-02-26 22:16:09
stackoverflow用户5243
stackoverflow用户5243

我不会感到惊讶,如果 WoW 不使用 DirectX 文字绘制方法。拥有自己的定制文本绘制解决方案可以让您在支持编码方面获得更多的灵活性。这并不难。

2010-02-26 22:56:29
stackoverflow用户282536
stackoverflow用户282536

你可以让 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 } )

然后,使你所有的函数都只接受 UTF-16 字符串类型(可以是 Lua 字符串或某种类似于 wchar_t 数组的用户数据)。

如果你不理解,我可以提供更多帮助...

2010-02-27 04:37:53