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