簡體   English   中英

Windows游戲:UTF-8,UTF-16,DirectX和Lua

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

那么,我該怎么辦? 我能想到以下幾點:

  1. 放棄UTF的想法; 使用ISO-8859-1並感到高興(這是魔獸世界所做的,至少對於enUS版本而言)
  2. 將每一幀的每一個字符串從UTF-8轉換為UTF-16(我擔心性能問題,考慮到每個字符串每秒會執行60次以上,並且它是O(N)我很漂亮確定它會相當慢)
  3. 對於每個lua字符串,保留UTF-16副本; 浪費大量內存,很難實現(當他們在Lua中更改時保持UTF-16字符串更新等)

它也不使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM