【问题标题】:Windows game: UTF-8, UTF-16, DirectX and LuaWindows 游戏:UTF-8、UTF-16、DirectX 和 Lua
【发布时间】:2011-01-21 15:48:02
【问题描述】:

我正在为 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 副本;巨大的内存浪费,很难实现(当 UTF-16 字符串在 Lua 中发生变化时保持最新等)

【问题讨论】:

  • 您需要先将 UTF-8 char*(或 std::string)转换为宽字符串,然后才能将其与 Windows API 一起使用。幸运的是,API 包含一个函数,但我不记得它叫什么。
  • 为什么不能将所有字符串都保存为 UTF-16 格式?无论如何,您都希望在资源中的代码中保留字符串,对吗?
  • @John:这些可能是在 Lua 脚本中生成的字符串(因此超出了基础程序的控制范围)。

标签: c++ windows encoding lua utf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这实际上不是一个坏主意。您是否有任何指向论文/教程/等的链接来解释如何执行此操作? (PS 票数用完了,60 分钟后投票)
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-10-08
        • 1970-01-01
        • 2020-01-28
        • 2011-02-10
        • 2014-08-21
        • 1970-01-01
        • 2021-01-30
        • 2011-01-11
        • 2015-09-21
        相关资源
        最近更新 更多