代码之家  ›  专栏  ›  技术社区  ›  Andreas Bonini

Windows游戏:utf-8、utf-16、directx和lua

  •  2
  • Andreas Bonini  · 技术社区  · 15 年前

    我正在为学习开发一个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。

    所以我想,让我们用普通的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中发生更改时,保持其最新状态,等等)
    4 回复  |  直到 15 年前
        1
  •  5
  •   Hans Passant    15 年前

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

        2
  •  2
  •   daurnimator    15 年前

    您可以让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数组))。

    如果你不明白的话,我可以帮你更多的忙…

        3
  •  1
  •   Joey Adams    15 年前

    __、___、__/____§。我一直在星际争霸中看到这一点,因为它不支持Unicode。

    好好打一场!使用UTF-8。每个帧都转换成UTF-16格式(除非有更好的方法可以做到这一点,这在文档中已经提到了,而我实在懒得看这些文档)。在出现问题之前,不要担心这里的性能!

        4
  •  1
  •   Torlack    15 年前

    我不会惊讶的是,哇哦,不使用DirectX文本绘制方法。拥有自己的自定义文本绘制解决方案可以为编码提供更大的灵活性。不难。