我正在開發一個用於學習目的的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。
那麼,我該怎麼辦?我可以想到以下幾點:
- 放棄UTF的想法;使用ISO-8859-1並且很開心(這是魔獸世界的功能,至少對於enUS版本來說)
- 將每一個單一字符串從UTF-8轉換爲UTF-16(我很擔心性能問題,但考慮到它會做每秒60+次,每個字符串,它是O(N)我很確定它會相當緩慢)
- 對於每個lua字符串保持一個UTF-16副本;內存巨大的浪費,很難實現(保持UTF-16字符串的最新的,當他們在Lua變化等)
你需要的UTF-8字符*(或std ::字符串)成寬字符串轉換爲使用它之前, Windows API。幸運的是,API包含一個函數,但我不記得它是什麼。 – Tronic 2010-02-26 22:14:15
爲什麼你不能以UTF-16格式保存所有的字符串?無論如何,你想在代碼中保留字符串,對嗎? – 2010-02-26 22:20:50
@John:這些可能是在Lua腳本中生成的字符串(因此超出了基本程序的控制範圍)。 – Amber 2010-02-26 22:34:48