wxWidgets随笔(7)-utf8中文(3)
注意,與wxWidgets一起使用的窄字符串通常被認為是當前語言環境編碼,因此寫入
wxMessageBox("Salut à toi!");如果用戶系統上使用的編碼與ISO-8859-1不兼容,則無法工作(對于gcc,即使源代碼是在不同的地區編譯的)。特別是,在現代Unix系統下最常用的編碼是UTF-8,由于上面的字符串不是有效的UTF-8字節序列,在這種情況下根本不會顯示任何內容。因此,重要的是永遠不要在程序源代碼中直接使用8位(而不是7位)字符,而是使用寬字符串,或者寫:
wxMessageBox(wxString::FromUTF8("Salut \xC3\xA0 toi!"));// in UTF8 the character U+00E0 is encoded as 0xC3A0以類似的方式,wxString以wchar_t或char字符緩沖區的形式提供對其內容的訪問。當然,后者只在字符串包含當前語言環境編碼中可表示的數據時才有效。如果字符串最初是由一個窄字符串構造的,或者它只包含7位ASCII數據,但如果不是這樣,就不能保證轉換成功。與上面的wxString::FromUTF8()示例一樣,您總是可以使用wxString::ToUTF8()來檢索UTF-8編碼的字符串內容—這與使用當前語言環境轉換為char*不同,它不會失敗。
有關wxString如何工作的更多信息,請參見wxString概述。
總而言之,wxWidgets中的Unicode支持對于應用程序來說是透明的,如果您使用wxString對象來存儲程序中的所有字符數據,實際上沒有什么特別的事情要做。但是,您應該了解以下部分所涉及的潛在問題。
wxWidgets在所有系統下默認使用wxString實現中的系統wchar_t。因此,在Microsoft Windows下,UCS-2 (UTF-16的簡化版本,不支持代理字符)在這個平臺上被用作wchar_t是2字節。在Unix系統下,包括Mac OS X,默認使用UCS-4(也稱為UTF-32),但是也可以通過傳遞-enable-utf8選項進行配置來構建wxWidgets在內部使用UTF-8。
wxString提供的接口與內部使用的格式是獨立的。然而,不同的格式有特定的優點和缺點。值得注意的是,在Unix下,底層圖形工具包(例如GTK+)通常使用UTF-8編碼的字符串,并且對wxWidgets中的字符串使用相同的表示形式,這樣就可以避免每次在UI中顯示或從中檢索字符串時將UTF-32轉換為UTF-8,反之亦然。對于小字符串,這種轉換的開銷通常可以忽略不計,但對于某些程序來說可能很重要。如果你相信它將有利于使用utf - 8的字符串在您的特定應用程序,你可能重建wxWidgets使用utf - 8作為解釋上面(注意,這是目前不支持微軟的Windows操作系統下,可以說是沒有多大意義的Windows本身并不使用utf - 16和utf - 8),但一定要注意性能影響(見使用utf - 8)性能的影響,使用utf - 8 wxString之前這樣做!
一般來說,您應該只在特定的環境中使用非默認的UTF-8構建,例如,在資源受限的系統中,轉換的開銷(以及與歐洲語言的UTF-32相比,UTF-8的內存使用量減少)可能很重要。如果您的程序正在運行的環境是在你的控制之下——通常情況下這樣的場景——考慮確保系統總是使用utf - 8語言環境和使用-enable-utf8only配置選項來禁用支持其他地區和考慮所有字符串utf - 8。這進一步減少了代碼的大小,并且在更多的情況下不需要轉換。
Unicode相關的預處理器符號
現在將wxUSE_UNICODE定義為1,以表示對Unicode的支持。可以在MSW的setup.h中顯式地將其設置為0,也可以在Unix下使用-disable-unicode,但強烈建議不要這樣做。默認情況下,wxUSE_UNICODE_WCHAR也被定義為1,但是在UTF-8構建中(在前一節中描述),它被設置為0,而通常為0的wxUSE_UNICODE_UTF8被設置為1。在后一種情況下,wxUSE_UTF8_LOCALE_ONLY也可以設置為1,表示所有字符串都被認為是UTF-8。
為了更好地解釋上述內容,請考慮上述示例的第二個字符串;它由3個字符和最后的NULL組成:
可以看到,UTF16編碼很簡單(對于BMP中的字符),在本例中,UTF16編碼的wxString占用8個字節。UTF8編碼更詳細,在本例中使用了7個字節。
一般來說,對于包含很多拉丁字符的字符串,UTF8在內存占用方面比UTF16有很大的優勢,但是對于一些常見的操作,如長度計算,則需要更多的處理。
最后,請注意,wxString用于存儲Unicode代碼單元(wchar_t或char)的類型總是類型指定為wxStringCharType。
可這樣使用UTF8中文
const wchar_t* a =L"歡迎使用wxWidgets!"; SetStatusText(wxString(a)); wxMessageBox(L"我的第一個程序",L"關于 Hello World", wxOK | wxICON_INFORMATION ); const wchar_t* a =L"歡迎使用wxWidgets!"; SetStatusText(a);總結
以上是生活随笔為你收集整理的wxWidgets随笔(7)-utf8中文(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot中打包插件spri
- 下一篇: log4j2 mysql_spring