wxWidgets随笔(6)-utf8中文(2)
當使用Microsoft Visual c++時不能編譯,需要更改為使用mb_str()(這對于包含Unicode字符的文件名無效,請考慮使用wxWidgets類和函數來處理這些文件名,因為標準c++庫不支持它們)。
另一類不兼容的更改是由于修改了一些虛方法來使用wxString參數而不是const wxChar參數,從而使它們同時接受窄字符串和寬字符串。這不是一個問題,如果你只是調用這些函數,但你需要改變簽名的派生類版本,如果你覆蓋他們,否則他們不會被調用了。再次強調,確保這個問題不出現的最佳方法是使用警告函數簽名不匹配的編譯器重新構建代碼(可以使用-Woverloaded-virtual g++選項)。
最后,一些結構字段,如著名的wxCmdLineEntryDesc::shortName、longName和description字段已被更改為const char類型,而不是const wxChar*類型,因此,如果將wxT()或_T()與它們的初始化器一起使用,則需要刪除它們。
Unicode是什么?
Unicode是一種字符編碼標準,它解決了以前標準(如ASCII標準)的缺點,使用8位、16位或32位對每個字符進行編碼。這使得有足夠的代碼點(參見下面的定義)一次性編碼所有世界語言。更多關于Unicode的細節可以在http://www.unicode.org/找到。
從實用的角度來看,在為國際用戶編寫應用程序時,使用Unicode幾乎是必需的。此外,任何讀取它沒有生成的文件或從網絡中從其他服務接收數據的應用程序都應該準備好處理Unicode。
Unicode表示和術語
在使用Unicode時,定義一些術語的含義非常重要。
字形是表示字符或字符的一部分的特定圖像(通常是字體的一部分)。任何字符可以有一個或多個關聯的字形;例如,大寫字母“A”可能包含的符號有:
Unicode為幾乎所有現有的字母/腳本中的每個字符分配一個數字,這個數字稱為代碼點;它通常在文檔手冊和Unicode網站上表示為U+xxxx,其中xxxx是十六進制數。
注意,通常一個字符只分配一個代碼點,但也有例外;所謂的預組合字符(參見http://en.wikipedia.org/wiki/Precomposed_character)或連接。在這些情況下,單個“字符”可能映射到多個代碼點,反之亦然,多個字符可能映射到單個代碼點。
Unicode標準將所有可能的代碼點的空間劃分為平面;一個平面的范圍是65,536(1000016)個連續的Unicode編碼點。平面編號從0到16,其中第一個平面是BMP,即基本多語言平面。BMP包含所有現代語言的字符和大量特殊字符。其他平面實際上主要包含歷史腳本、特殊用途字符或未使用的字符。
代碼點在計算機內存中表示為一個或多個代碼單元的序列,其中一個代碼單元是一個內存單元:8、16或32位。更準確地說,代碼單元是表示用于處理或交換的編碼文本單元的最小位組合。
UTF或Unicode轉換格式是將Unicode代碼點映射到代碼單元序列的算法。其中最簡單的是UTF-32,其中每個代碼單元由32位(4字節)組成,每個代碼點總是由單個代碼單元(固定長度編碼)表示。(注意,即使UTF-32也不是完全無關緊要的,因為小端和大端架構的映射是不同的)。UTF-32通常在Unix系統下用于Unicode字符串的內部表示。
另一個非常普遍的標準是UTF-16,它被Microsoft Windows使用:它使用16位編碼單元(2字節)編碼第一個(大約)64千個Unicode編碼點(BMP平面),并使用一對16位編碼單元來編碼后面的字符。這些對被稱為代理。因此,UTF16使用可變數量的代碼單元來編碼每個代碼點。
最后,用于外部Unicode存儲(例如文件和網絡協議)的最廣泛的編碼是UTF-8,它是面向字節的,因此避免了UTF-16和UTF-32的endianness二義性。UTF-8使用8位(1字節)的代碼單位;在通常的英文字母之外的代碼點使用可變的字節數表示,這使得它在內部表示方面的效率低于UTF-32。
作為理解到目前為止所描述的各種概念之間的差異的可視化幫助,查看相同代碼點的不同UTF表示:
在這種特殊情況下,UTF8需要比UTF16更多的空間(3字節而不是2字節)。
請注意,從C/ c++程序員的角度來看,由于標準類型wchar_t(通常用于表示C/ c++中的Unicode(“寬”)字符串)并不是在所有平臺上都具有相同的大小,所以情況更加復雜。它在Unix系統下是4字節,與使用UTF-32的傳統相對應,但在Windows下只有2字節,這是與使用UTF-16的操作系統兼容所必需的。
通常使用UTF8時,代碼單元被存儲到char類型中,因為幾乎所有系統上的char都是8位寬的;使用UTF16時,通常將代碼單元存儲在wchar_t類型中,因為wchar_t在所有系統上至少是16位的。這也是wxString使用的方法。有關更多信息,請參見wxString概述。
參見http://unicode.org/glossary/獲得上述術語的官方定義。
wxWidgets中的Unicode支持
默認情況下總是使用Unicode
由于wxWidgets 3.0 Unicode支持始終是啟用的,雖然構建沒有它的庫仍然是可能的,但不建議再使用它,并且在不久的將來將不再支持它。這意味著只在內部使用Unicode字符串,在Microsoft Windows下使用Unicode系統API,這意味著wxWidgets程序需要Microsoft層才能在Windows 95/98/ME上運行Unicode。
但是,與以前版本的wxWidgets的Unicode構建模式不同,這種支持基本上是透明的:即使也支持寬字符串(即utf16編碼的wchar_t或utf8編碼的char),您仍然可以繼續使用窄字符串(即當前本地語言環境編碼的char*)。任何wxWidgets函數都接受這兩種類型的參數,因為這兩種類型的字符串都被隱式地轉換為wxString
總結
以上是生活随笔為你收集整理的wxWidgets随笔(6)-utf8中文(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wxWidgets随笔(5)-utf8中
- 下一篇: spring boot中打包插件spri