2010-02-26 74 views
2

我正在开发一个用于学习目的的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

那么,我该怎么办?我可以想到以下几点:

  1. 放弃UTF的想法;使用ISO-8859-1并且很开心(这是魔兽世界的功能,至少对于enUS版本来说)
  2. 将每一个单一字符串从UTF-8转换为UTF-16(我很担心性能问题,但考虑到它会做每秒60+次,每个字符串,它是O(N)我很确定它会相当缓慢)
  3. 对于每个lua字符串保持一个UTF-16副本;内存巨大的浪费,很难实现(保持UTF-16字符串的最新的,当他们在Lua变化等)
+0

你需要的UTF-8字符*(或std ::字符串)成宽字符串转换为使用它之前, Windows API。幸运的是,API包含一个函数,但我不记得它是什么。 – Tronic 2010-02-26 22:14:15

+1

为什么你不能以UTF-16格式保存所有的字符串?无论如何,你想在代码中保留字符串,对吗? – 2010-02-26 22:20:50

+0

@John:这些可能是在Lua脚本中生成的字符串(因此超出了基本程序的控制范围)。 – Amber 2010-02-26 22:34:48

回答

5

它不使用或者8859,它使用系统的本地代码页。您可以转换为UTF16并通过自己转换字符串来使用DrawText()。如果你的班级图书馆没有任何支持,那么你可以使用MultiByteToWideChar()

1

í·œêμì-'/ì“ì”맧。我一直在星际争霸中看到这一点,因为它没有对Unicode进行适当的支持。

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

1

我不会感到震惊的是WoW并没有使用DirectX文本绘制方法。拥有自己的自定义文本绘制解决方案,可以为编码提供更多的灵活性。这并不难。

+0

这实际上不是一个坏主意。你有任何链接到论文/教程/等解释如何做到这一点? (PS跑出了票,60分钟内就会升级) – 2010-02-26 23:01:27

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 }) 

然后只是把所有的功能只需要在UTF-16字符串类型(这可能是一个Lua字符串或某种形式的用户数据的(这可能是你的wchar_t阵列))

我可以帮更多,如果你不明白...