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

2022-09-21 17:06:12 字數 2303 閱讀 7178

**自:

本文主要分析了基於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。這樣源字符集,執行字符集都是一致。

QT中文亂碼解決方法

由於我畢設的介面是用qt做的,之前沒怎麼接觸過qt,所以實現過程中遇到不少小問題,頭乙個就是這個。現如今寶寶將其記錄下來,供同樣有需要的同學或者自己以後方便查閱。1 所有檔案編碼格式須一致 2 新增 和標頭檔案 我新增在了main函式中 include 標頭檔案 qtextcodec setcode...

Qt輸入中文出現亂碼的解決方法

在qt程式中有時候存在程式中輸入中文,執行之後亂碼的情況,如使用最簡單的qmessagebox彈框 qmessagebox warning 0 tr 選擇使用者 tr 請先從使用者列表選擇要傳送的使用者 qmessagebox ok 會出現這樣的效果 這種情況出現的原因有 前者是因為在 linux上...

linux中文亂碼解決方法

在使用centos 系統時,安裝的時候可能你會遇到英文的centos系統,在這中情況下安裝centos系統時是預設安裝 即英文 安裝完畢後,出現的各種中文亂碼。那麼,我們如何解決這種問題呢。一 centos系統訪問 g.cn 發現中文亂碼。於是用以前的方式 yum y install fonts c...