[英]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 。
那么,我该怎么办? 我能想到以下几点:
它也不使用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.