2010-02-26 73 views
2

我正在開發一個用於學習目的的Windows遊戲(我正在學習DirectX)。我希望它有UTF支持。Windows遊戲:UTF-8,UTF-16,DirectX和Lua

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。

所以我想,我們只需使用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副本;內存巨大的浪費,很難實現(保持UTF-16字符串的最新的,當他們在Lua變化等)
+0

你需要的UTF-8字符*(或std ::字符串)成寬字符串轉換爲使用它之前, Windows API。幸運的是,API包含一個函數,但我不記得它是什麼。 – Tronic 2010-02-26 22:14:15

+1

爲什麼你不能以UTF-16格式保存所有的字符串?無論如何,你想在代碼中保留字符串,對嗎? – 2010-02-26 22:20:50

+0

@John:這些可能是在Lua腳本中生成的字符串(因此超出了基本程序的控制範圍)。 – Amber 2010-02-26 22:34:48

回答

5

它不使用或者8859,它使用系統的本地代碼頁。您可以轉換爲UTF16並通過自己轉換字符串來使用DrawText()。如果你的班級圖書館沒有任何支持,那麼你可以使用MultiByteToWideChar()

1

í·œêμì-'/ì「ì」맧。我一直在星際爭霸中看到這一點,因爲它沒有對Unicode進行適當的支持。

打好戰!使用UTF-8。每幀轉換爲UTF-16(除非在文檔中提到的更好的方法我懶得看)。不要擔心這裏的表現,直到它成爲一個問題!

1

我不會感到震驚的是WoW並沒有使用DirectX文本繪製方法。擁有自己的自定義文本繪製解決方案,可以爲編碼提供更多的靈活性。這並不難。

+0

這實際上不是一個壞主意。你有任何鏈接到論文/教程/等解釋如何做到這一點? (PS跑出了票,60分鐘內就會升級) – 2010-02-26 23:01:27

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 }) 

然後只是把所有的功能只需要在UTF-16字符串類型(這可能是一個Lua字符串或某種形式的用戶數據的(這可能是你的wchar_t陣列))

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