QT5 中文乱码问题
為什么會出現亂碼
首先,我們需要有的概念是亂碼的問題是由編碼和解碼方式引起的。涉及到編碼方式的地方有3個:
源碼字符集(the source character set):源碼文件時使用何種編碼格式保存的。
執行字符集(the execution character):可執行程序內保存的是何種編碼(程序執行時內存中字符串編碼)
gcc 運行字符集設置參數
-finput-charset=charset //設置源碼字符集為charset
-fexec-charset=charset //設置執行字符集為charset
-fwide-exec-charset=charset //設置寬字符串的執行字符集為charset
msvc 運行字符集設置參數
-execution-charset:utf-8 // 指明程序執行時使用UTF-8字符集
-source-charset:utf-8 // 指明源碼文件的編碼為UTF-8字符集
源碼字符集確切的說是編譯器認為源碼文件的編碼方式,執行字符集是可執行程序采用的編碼方式,而運行環境字符集則是環境支持的編碼方式。編譯程序處理字符串的過程,實際上是首先讀入字符的二進制數,根據編碼格式到另一種編碼格式轉換策略得到另外一串二進制數,所以1->2可能有二進制數的變化,而3則是通過既定的編碼方式來解讀2中的二進制數為字符(這里為什么說可能呢,因為1和2如果是相同的編碼是不需要變化的)。
那么亂碼的原因有:
①編譯器解讀源碼字符集錯誤。如我是utf-8的源碼,因為不帶bom你當成locale,執行字符集也是locale所以不需要轉換,而本來utf-8到locale是需要轉換的。
②源碼字符集到執行字符集的轉換錯誤。如本來把識別正確的源碼字符集locale轉成執行字符集中的utf-8,結果你給我指定了錯誤了轉換方式,說讓我通過xxx編碼轉utf-8的策略轉(Note:這是錯誤的表述,看到下面你就明白,實際上這里的錯誤只能是應為轉換算法的錯誤)。
③字符解析錯誤。如果現在程序中的字符串二進制是utf-8的,結果你非要說執行字符集是loacle,那么解析肯定會出錯。
還需要理解的包括下面的知識:
- windows console控制臺代碼頁為locale,即把程序中的字符串二進制表示當locale執行字符集來解讀
- 字符串二進制的表示形式不需要編譯,直接拷貝到執行程序的二進制中
總結
以上是生活随笔為你收集整理的QT5 中文乱码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QString和string互相转换乱码
- 下一篇: C++返回引用,使用引用接收和非引用接收