Windows 早期采用多字節(jié)編碼,的確容易出現(xiàn)亂碼問(wèn)題。隨著 Windows 全面轉(zhuǎn)向 Unicode 編碼,多語(yǔ)言的支持得到完美解決,出現(xiàn)中文亂碼的問(wèn)題就很少出現(xiàn)。出現(xiàn)亂碼問(wèn)題一般是 GBK 編碼的文件當(dāng)做 utf8 編碼打開(kāi),或者 utf8編碼的文件當(dāng)做 GBK 編碼打開(kāi)。這種情況也多出現(xiàn)在 Linux 和 Windows 之間交換文件。
這幾個(gè)月開(kāi)始使用 QT 開(kāi)發(fā)應(yīng)用程序,不管是 Windows,還是 Linux 系統(tǒng)下,沒(méi)怎么去特意配置,編寫(xiě)出來(lái)的應(yīng)用程序不管哪國(guó)語(yǔ)言,都顯示得挺好。甚至在 Linux 系統(tǒng)語(yǔ)言選擇英語(yǔ),也可以正常顯示中文、日文等。
但是今天碰到一個(gè) QT 應(yīng)用程序中文亂碼問(wèn)題,而且還是在 Windows 下,搞得措不及手。
情況是這樣的,QT 代碼是別人的,別人給的可執(zhí)行程序也沒(méi)有中文亂碼問(wèn)題。但是這個(gè) QT 項(xiàng)目在我這邊編譯,編出來(lái)的程序就有亂碼問(wèn)題。
我先是懷疑代碼采用了 GBK 之類的編碼,但是逐一檢查,都是采用的 utf8,使用記事本打開(kāi),保存,都能顯示正常。一般來(lái)說(shuō),采用 ut8編碼是一個(gè)非常保險(xiǎn)的方案。全程使用 utf8,對(duì)多語(yǔ)言的支持最好。
那問(wèn)題是不是出在 Windows 下特有的 utf8 BOM 上呢?
這里提一下,BOM 代表 Byte order mark,也就是字節(jié)序標(biāo)記,有2個(gè)作用:
1. 說(shuō)明字符流屬于Unicode編碼,且表明了編碼方式
2. 說(shuō)明了字節(jié)序:big endian 和 little endian
一般來(lái)說(shuō),utf8不需要 BOM,純粹是微軟搞出來(lái)的。鑒于 Windows 是使用最廣泛的操作系統(tǒng),盡管 Linux 程序員極度抵制 utf8 BOM,但也阻止不了。
但在 QT 應(yīng)用程序亂碼問(wèn)題上,和 utf8 BOM 并沒(méi)有什么關(guān)系,是否帶 BOM 只是文件頭幾個(gè)字節(jié)的差異,要么直接出錯(cuò),不會(huì)引起亂碼。
而且這個(gè)亂碼問(wèn)題還非常奇怪,在 QT 界面設(shè)計(jì)器中輸入的中文顯示正常,但是通過(guò) C++代碼添加的字符串就有亂碼問(wèn)題。難不成是字符串類的問(wèn)題,但是我在代碼中使用的 QString,內(nèi)部就是用的 utf8編碼,即使我強(qiáng)行指定 utf8編碼,問(wèn)題也沒(méi)解決。
這個(gè)問(wèn)題我也問(wèn)過(guò) GPT,GTP 給的方法也是檢查源碼的編碼,編輯器的編碼設(shè)定,使用QString 的編碼轉(zhuǎn)換方法等等,都沒(méi)效果。
中文亂碼問(wèn)題可能只會(huì)出現(xiàn)在中文世界,可能中國(guó)程序員碰到的幾率會(huì)更大,于是我就上網(wǎng)搜索吧。使用 “QT 中文亂碼”作為關(guān)鍵詞,果然搜到一堆反映這個(gè)問(wèn)題的。其中一篇文章講到:
在 Qt Creator 中使用 MSVC 編譯器編譯項(xiàng)目時(shí),若處理不當(dāng)容易出現(xiàn)中文字符串亂碼問(wèn)題。 例如,程序運(yùn)行時(shí),LabInfo顯示的漢字就會(huì)出現(xiàn)亂碼。
void MainWindow::Changed()
{
? ? QString str="測(cè)試";
? ? ui->LabInfo->setText(str);
}?
這是因?yàn)镼t Creator保存的文件使用的是UTF-8編碼(是任何平臺(tái)、任何語(yǔ)言都可以使用的跨平臺(tái)的字符集),MSVC編譯器雖然可以正常編譯帶BOM的UTF-8編碼的源文件,但是生成的可執(zhí)行文件的編碼是 Windows 本地字符集,比如 GBK2312。
也就是在可執(zhí)行文件中,字符串“測(cè)試”是以GBK2312編碼的,而可執(zhí)行程序執(zhí)行到這條語(yǔ)句時(shí),對(duì)這個(gè)字符串卻是以UTF-8解碼的,這樣就會(huì)出現(xiàn)亂碼。
解決方案之一:
在pro文件中添加
win32:msvc{
? ? QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
}
按照文章提供的方法,很快解決了界面上的中文亂碼問(wèn)題。
不過(guò)我還是有點(diǎn)不明白,之前創(chuàng)建 QT 應(yīng)用程序也沒(méi)有加這個(gè)選項(xiàng),也沒(méi)見(jiàn)出問(wèn)題。為啥這個(gè)工程就會(huì)出問(wèn)題。
繼續(xù)查問(wèn)題,我發(fā)現(xiàn)在 QT 應(yīng)用程序中鏈接 userlib32,如果不指定上面的編譯選項(xiàng),就會(huì)有亂碼問(wèn)題??磥?lái)問(wèn)題出在鏈接 Windows 庫(kù)上面,所以保險(xiǎn)的方法就是加上編譯選項(xiàng),強(qiáng)行指定源碼和可執(zhí)行程序都使用 utf8編碼。
最后,還有一點(diǎn)需要注意,如果調(diào)用第三方庫(kù),在返回字符串的時(shí)候,可能不是采用的 utf8,這個(gè)時(shí)候需要顯式轉(zhuǎn)換編碼,否則也可能出現(xiàn)亂碼。
程序開(kāi)發(fā)中經(jīng)常會(huì)出現(xiàn)莫名其妙的問(wèn)題,問(wèn)題雖然小,但如果以前沒(méi)碰到過(guò),解決起來(lái)也挺費(fèi)時(shí)間的,所以在這里記錄一下,也許以后還會(huì)碰到類似的問(wèn)題。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-794222.html
另外解決問(wèn)題時(shí)也不能過(guò)度依賴 GPT,這次就是查 GPT,而沒(méi)想著去網(wǎng)上搜索。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-794222.html
到了這里,關(guān)于QT 應(yīng)用程序在 Windows 系統(tǒng)上出現(xiàn)中文亂碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!