亚洲国产第一_开心网五月色综合亚洲_日本一级特黄特色大片免费观看_久久久久久久久久免观看

Hello! 歡迎來(lái)到小浪云!


QT 應(yīng)用程序在 Windows 系統(tǒng)上出現(xiàn)中文亂碼


windows 系統(tǒng)上使用 qt 開(kāi)發(fā)應(yīng)用程序時(shí),可能會(huì)遇到中文亂碼問(wèn)題。即使 Windows 已經(jīng)全面轉(zhuǎn)向 unicode 編碼,但有時(shí)仍會(huì)因?yàn)榫幋a不匹配而出現(xiàn)亂碼。以下是詳細(xì)的分析和解決方案:

QT 應(yīng)用程序在 Windows 系統(tǒng)上出現(xiàn)中文亂碼 alt=”qt 應(yīng)用程序在 Windows 系統(tǒng)上出現(xiàn)中文亂碼” />

Windows 早期采用多字節(jié)編碼,的確容易出現(xiàn)亂碼問(wèn)題。隨著 Windows 全面轉(zhuǎn)向 Unicode 編碼,多語(yǔ)言的支持得到了極大改善,出現(xiàn)中文亂碼的問(wè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)用程序,無(wú)論是在 Windows 還是 Linux 系統(tǒng)下,沒(méi)有特別配置,編寫(xiě)出來(lái)的應(yīng)用程序都能很好地顯示各種語(yǔ)言。即使在 Linux 系統(tǒng)中選擇英語(yǔ)語(yǔ)言設(shè)置,也能正常顯示中文、日文等。

然而,今天遇到了一個(gè) QT 應(yīng)用程序在 Windows 下出現(xiàn)中文亂碼的問(wèn)題,令人措手不及。

具體情況是這樣的,QT 代碼來(lái)自他人,別人提供的可執(zhí)行程序沒(méi)有中文亂碼問(wèn)題。但是在我這里編譯這個(gè) QT 項(xiàng)目,生成的程序卻出現(xiàn)了亂碼。

首先,我懷疑代碼采用了 GBK 之類(lèi)的編碼,但經(jīng)過(guò)逐一檢查,發(fā)現(xiàn)都是采用 utf8 編碼,使用記事本打開(kāi)和保存時(shí)都能正常顯示。通常,采用 utf8 編碼是一個(gè)非常安全的方案,全程使用 utf8 對(duì)多語(yǔ)言的支持是最好的。

那么問(wèn)題是否出在 Windows 特有的 utf8 bom 上呢?

這里需要提一下,BOM 代表 Byte order mark,即字節(jié)序標(biāo)記,有兩個(gè)作用:

  1. 說(shuō)明字符流屬于 Unicode 編碼,且表明了編碼方式。
  2. 說(shuō)明了字節(jié)序:big endian 和 little endian。

一般來(lái)說(shuō),utf8 不需要 BOM,這是微軟搞出來(lái)的。由于 Windows 是使用最廣泛的操作系統(tǒng),盡管 Linux 程序員極度抵制 utf8 BOM,但也無(wú)法阻止它的存在。

但是在 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)題。難道是字符串類(lèi)的問(wèn)題嗎?但我在代碼中使用的是 QString,內(nèi)部就是用的 utf8 編碼,即使我強(qiáng)行指定 utf8 編碼,問(wèn)題也沒(méi)有解決。

這個(gè)問(wèn)題我也咨詢(xún)過(guò) gpt,GPT 給出的方法是檢查源碼的編碼、編輯器的編碼設(shè)定、使用 QString 的編碼轉(zhuǎn)換方法等,但都沒(méi)有效果。

中文亂碼問(wèn)題可能只會(huì)出現(xiàn)在中文世界,中國(guó)程序員碰到的幾率會(huì)更大,于是我上網(wǎng)搜索,使用“QT 中文亂碼”作為關(guān)鍵詞,果然找到了很多相關(guā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)?Qt 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)有出現(xiàn)問(wèn)題。為什么這個(gè)工程會(huì)出問(wèn)題呢?

繼續(xù)查問(wèn)題,我發(fā)現(xiàn),在 QT 應(yīng)用程序中鏈接 userlib32,如果不指定上面的編譯選項(xiàng),就會(huì)出現(xiàn)亂碼問(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ì)碰到類(lèi)似的問(wèn)題。

另外,解決問(wèn)題時(shí)也不能過(guò)度依賴(lài) GPT,這次就是查 GPT,而沒(méi)想著去網(wǎng)上搜索。

相關(guān)閱讀