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

时间:2010-02-26 22:10:24

标签: c++ windows encoding lua utf

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

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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字符串或某种userdata(可能是你的wchar_t数组))

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

答案 2 :(得分:1)

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

打好斗争!使用UTF-8。每帧转换为UTF-16(除非在文档中提到的更好的方法,我懒得看)。在它出现问题之前不要担心性能!

答案 3 :(得分:1)

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