天天看點

CEGUI::String類分析

CEGUI::String類算是一個不錯的類,但是說實話,這個類讓非英文國度的IT們不是很舒服。比如,自我們學習C++程式設計以來,我們一直使用這樣的輸出語句:

其中"名字:"使用的是多位元組編碼(ASCII編碼的擴充版本)。我們的控制台能正确顯示這些中文文本。但是當我們初次了解并使用CEGUI的時候,卻無法使用這樣簡單的功能:

不是說編譯不過,而是顯示不正确。求其根源有兩個原因:

CEGUI 使用 utf32 編碼方案,這個并不重要。重要的是 CEGUI::String 如何将 const char* 這樣參數轉換成其内部編碼方式。隻要轉換正确,CEGUI會按照自己的方式,将utf32 編碼方案的文本顯示出來。但不幸的是,eddy博士的團隊并不認為 const char* 會指向非英文字元串,是以 CEGUI::String 接受 const char* 的構造函數,根本就沒有進行多位元組編碼到 utf32 編碼的轉換。

其次,即使我們将多位元組編碼正确轉換成了 utf32 編碼,傳給了CEGUI::String,我們也無法讓空間顯示出中文。這個問題主要是字型檔案的問題,正确的字元編碼必須使用正确字型檔案,才能正确顯示出中文。(一開始,我還以為是CEGUI::String本身的問題,後來到網上查了查,CEGUI::String的utf8構造函數是沒有問題的,隻是需要正确的字型檔案)

我們根據這兩個問題,分别給出解決方案:

CEGUI::String 接受幾種字元串類型,通過檢視源碼CEGUI::String隻支援其他三種字元串類型:

第一種和第二種其實是一樣的,std::string隻不過是 const char* 的封裝類,内部還是使用的多位元組編碼。第三種是接受一個utf8編碼的字元串。之前我們講過,CEGUI::String 根本不對 const char* 進行适當的編碼轉換,是以如果我們想傳入中文文本,那麼,我們唯一的出路是使用 utf8 編碼的字元串。這樣我們就需要構造 utf8 字元串了。Window SDK有響應的函數可以幫助我們完成多位元組編碼到utf8編碼的轉換。下面是我寫的轉換函數:

給出正确的字型檔案。

首先到 C:\WINDOWS\Fonts 路徑下找到一個帶有中文字元的字型檔案 ”simhei",拷貝一下,然後放到 CEGUI SDK 的 datafiles\fonts 路徑下。

複制 CEGUI SDK 的 datafiles\fonts 下的一個.font文本,然後粘貼一下(出來一個該檔案的副本),更改檔案名為simhei.font。然後用寫字闆或者記事本打開,如下文本:

修改 Name(代表程式中使用什麼名字表示該字型) 和 Filename(該字型對應的字型檔案名)字段:

修改對應的.scheme檔案,打開TaharezLook.scheme檔案,将

修改為:

最後還是建議,直接修改CEGUI::String的源碼,将ASCII正确地轉換成 utf32 編碼,這樣效率更高一點,使用也更加舒服。例如,添加下列代碼到CEGUI::String類中可實作直接傳遞寬字元:

因為utf16絕大部分是utf32的子集,是以可以直接指派(至少對于漢字來說可以)。

繼續閱讀