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