QT 應用程序在 Windows 系統上出現中文亂碼

windows 系統上使用 qt 開發應用程序時,可能會遇到中文亂碼問題。即使 windows 已經全面轉向 unicode 編碼,但有時仍會因為編碼不匹配而出現亂碼。以下是詳細的分析和解決方案:

QT 應用程序在 Windows 系統上出現中文亂碼 alt=”QT 應用程序在 Windows 系統上出現中文亂碼” />

Windows 早期采用多字節編碼,的確容易出現亂碼問題。隨著 Windows 全面轉向 Unicode 編碼,多語言的支持得到了極大改善,出現中文亂碼的問題變得較少。出現亂碼問題一般是由于 GBK 編碼的文件被當做 utf8 編碼打開,或者 utf8 編碼的文件被當做 GBK 編碼打開。這種情況也多出現在 linux 和 Windows 之間交換文件。

最近幾個月開始使用 QT 開發應用程序,無論是在 Windows 還是 Linux 系統下,沒有特別配置,編寫出來的應用程序都能很好地顯示各種語言。即使在 Linux 系統中選擇英語語言設置,也能正常顯示中文、日文等。

然而,今天遇到了一個 QT 應用程序在 Windows 下出現中文亂碼的問題,令人措手不及。

具體情況是這樣的,QT 代碼來自他人,別人提供的可執行程序沒有中文亂碼問題。但是在我這里編譯這個 QT 項目,生成的程序卻出現了亂碼。

首先,我懷疑代碼采用了 GBK 之類的編碼,但經過逐一檢查,發現都是采用 utf8 編碼,使用記事本打開和保存時都能正常顯示。通常,采用 utf8 編碼是一個非常安全的方案,全程使用 utf8 對多語言的支持是最好的。

那么問題是否出在 Windows 特有的 utf8 bom 上呢?

這里需要提一下,BOM 代表 Byte order mark,即字節序標記,有兩個作用:

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

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

但是在 QT 應用程序的亂碼問題上,utf8 BOM 并沒有什么關系。是否帶 BOM 只是文件頭幾個字節的差異,要么直接出錯,不會引起亂碼。

而且這個亂碼問題還非常奇怪,在 QT 界面設計器中輸入的中文顯示正常,但是通過 c++ 代碼添加的字符串就有亂碼問題。難道是字符串類的問題嗎?但我在代碼中使用的是 QString,內部就是用的 utf8 編碼,即使我強行指定 utf8 編碼,問題也沒有解決。

這個問題我也咨詢過 gpt,GPT 給出的方法是檢查源碼的編碼、編輯器的編碼設定、使用 QString 的編碼轉換方法等,但都沒有效果。

中文亂碼問題可能只會出現在中文世界,中國程序員碰到的幾率會更大,于是我上網搜索,使用“QT 中文亂碼”作為關鍵詞,果然找到了很多相關討論。其中一篇文章提到:

在 Qt Creator 中使用 MSVC 編譯器編譯項目時,如果處理不當,容易出現中文字符串亂碼問題。例如,程序運行時,LabInfo 顯示的漢字就會出現亂碼。

void MainWindow::Changed() {     QString str="測試";     ui->LabInfo->setText(str); }

這是因為 Qt Creator 保存的文件使用的是 UTF-8 編碼(是任何平臺、任何語言都可以使用的跨平臺字符集),MSVC 編譯器雖然可以正常編譯帶 BOM 的 UTF-8 編碼的源文件,但生成的可執行文件的編碼是 Windows 本地字符集,比如 GBK2312。

也就是在可執行文件中,字符串“測試”是以 GBK2312 編碼的,而可執行程序執行到這條語句時,對這個字符串卻是以 UTF-8 解碼的,這樣就會出現亂碼。

解決方案之一:

在 pro 文件中添加:

win32:msvc{     QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8 }

按照文章提供的方法,很快解決了界面上的中文亂碼問題。

不過我還是有點不明白,之前創建 QT 應用程序沒有加這個選項,也沒有出現問題。為什么這個工程會出問題呢?

繼續查問題,我發現,在 QT 應用程序中鏈接 userlib32,如果不指定上面的編譯選項,就會出現亂碼問題。看來問題出在鏈接 Windows 庫上面,所以保險的方法就是加上編譯選項,強行指定源碼和可執行程序都使用 utf8 編碼。

最后,還有一點需要注意,如果調用第三方庫,在返回字符串的時候,可能不是采用的 utf8,這個時候需要顯式轉換編碼,否則也可能出現亂碼。

程序開發中經常會出現莫名其妙的問題,問題雖然小,但如果以前沒碰到過,解決起來也挺費時間的,所以在這里記錄一下,也許以后還會碰到類似的問題。

另外,解決問題時也不能過度依賴 GPT,這次就是查 GPT,而沒想著去網上搜索。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享