[英]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.