繁体   English   中英

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

[英]Windows game: UTF-8, UTF-16, DirectX and Lua

我正在开发一个用于学习目的的Windows游戏(我正在学习DirectX)。 我希望它有UTF支持。

阅读这个问题我了解到windows使用的是wchar_t ,它是UTF-16。 我希望我的游戏能够支持Lua脚本,而Lua并不太喜欢Unicode 。它只是将字符串视为“字节流”; 这对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副本; 浪费大量内存,很难实现(当他们在Lua中更改时保持UTF-16字符串更新等)

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM