我正在开发一款用于学习目的的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。
那么,我该怎么办?我能想到以下几点:
答案 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文本绘制方法。拥有自己的自定义文本绘制解决方案可以更灵活地支持编码。这不太难。