Qt - 中文亂碼原因以及解決方法


轉載自:https://blog.csdn.net/qq_35905572/article/details/95042444

本文主要分析了基於windows系統msvc2013編譯器的Qt中文亂碼。

 

概念

字庫表:是一個系統支持的文字,符號,數字的集合。

編碼字符集(字符集):我們平時所說的字符集就是這個,計算機以二進制的形式存儲字符,每個字符對應的二進制編碼不同,而編碼字符集就是所有編碼與字符的映射集合。

例如:在ASCII碼的編碼字符集中,字母A的編碼是65,65的二進制就是01000001。

字符編碼:不同字符的編碼不同,其二進制的位數也不同。為了達到節省空間,解析方便等目的,出現了多種存儲字符編碼的方式,每種方式對應一套算法也稱字符編碼。

例如:Unicode字符集,utf-8,utf-16字符編碼。

源文件字符集:源文件本身也是文本文件,所以源文件字符集是指源文件保存時采用哪種字符編碼。

執行字符集:可執行應用程序內使用何種字符編碼。編譯器會將源碼字符集轉換為執行字符集。

注意

1、當MSVC2013編譯程序的時候,會分析源文件采用何種編碼,有BOM標識符則可以正確識別其編碼,若沒有BOM標識符則認為其使用本地字符編碼local字符集。我們使用的windows系統本地字符編碼為GBK編碼。

2、編譯器分析出源文件字符編碼之后,會進行解碼再編碼,將源字符集轉碼成執行字符集。執行字符集一般默認為使用本地字符編碼local字符集,也可以進行設置。

QString顯示中文亂碼的原因

Qt5中QString內部采用unicode字符集,utf-16編碼。構造函數QString::QString(const char *str) 默認使用 fromUtf8() 將str所指的執行字符集從 utf-8 轉碼成 utf-16。

由上面fromUtf8()可知,QString需要執行字符集編碼為utf-8,然后以utf-8進行解碼,再編碼為utf-16才能獲得正確的字符編碼。

顯示中文亂碼的原因其實就QString轉碼方式與執行字符集不一致。(比如,源字符集為本地字符集GBK編碼,QString以utf-8的方式進行解碼,會導致獲得錯誤的二進制編碼,再將錯誤二進制轉為utf-16就會出現亂碼。)

中文亂碼測試

使用如下方法進行測試:首先創建QString對象str並初始化,因為QString構造函數內部調用了QString::fromUtf8(),所以它倆表現應該一致。QString::fromLocal8Bit()將執行字符集以本地編碼轉為utf-16。具體代碼如下:

例1,創建一個編碼為帶BOM標識的utf-8源文件,打印如下

打印前兩個發生了亂碼,fromLocal8Bit顯示正常。源文件帶BOM標識,因此編譯器可以正確識別源文件字符編碼,並以正確地方式將源字符集(utf-8編碼)轉為執行字符集即local字符集(GBK編碼)。此時執行字符集為loacl字符集,而fromUtf8將執行字符集以utf-8方式進行解碼,所以會出現亂碼。fromLocal8Bit將執行字符集以本地編碼進行轉碼,因此獲得正確的字符編碼。

例2,創建一個編碼為不帶BOM標識的utf-8源文件.,打印如下

打印前兩個顯示正常,fromLocal8Bit發生了亂碼。源文件不帶BOM標識,因此編譯器會認為源文件編碼為本地編碼,而執行字符集也是本地編碼,因此不會進行轉碼(本人推測的0.0),但實際上執行字符集是utf-8編碼。因此fromUtf8將執行字符集以utf-8進行解碼,顯示正確;而fromLocal8Bit將執行字符集以本地編碼進行解碼,顯示亂碼。

例3,使用預處理命令#pragma execution_character_set(“utf-8”),將執行字符集設置為utf-8。創建一個編碼為帶BOM標識的utf-8源文件.,打印如下

打印前兩個顯示正常,fromLocal8Bit發生了亂碼。編譯器識別源文件字符編碼為utf-8,執行字符集也為utf-8,因此不會轉碼。fromUtf8可以正確的以utf-8進行解碼,顯示正確。而fromLocal8Bit將執行字符集以本地編碼進行解碼,顯示亂碼。

例4,使用預處理命令#pragma execution_character_set(“utf-8”),將執行字符集設置為utf-8。創建一個編碼為不帶BOM標識的utf8源文件.,打印如下

三個顯示亂碼。編譯器識別源文件字符編碼為本地編碼(實際為utf-8編碼),並錯誤地將源字符集以本地編碼進行解碼,再編碼為utf-8(相當於utf-8以本地編碼轉碼為utf-8)。因此三者都顯示亂碼。

中文亂碼解決方法

綜上所述,解決Qt5中文亂碼的一個比較好的方式,源文件設置BOM標識的utf-8編碼,執行字符集為設置為utf-8。這樣源字符集,執行字符集都是一致。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM