#pragma execution_character_set("utf-8")在類中宣告此預編譯!!!指示char的執行字符集是utf-8編碼。為什麼會出現亂碼
首先,我們需要有的概念是亂碼的問題是由編碼和解碼方式引起的。涉及到編碼方式的地方有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,結果你給我指定了錯誤了轉換方式,說讓我通過***編碼轉utf-8的策略轉(note:這是錯誤的表述,看到下面你就明白,實際上這裡的錯誤只能是應為轉換演算法的錯誤)。
③字元解析錯誤。如果現在程式中的字串二進位制是utf-8的,結果你非要說執行字符集是loacle,那麼解析肯定會出錯。
還需要理解的包括下面的知識:
Qt5中文亂碼問題
標頭檔案加上 include 在類裡面定義變數 qtextcodec codec 在建構函式中初始化變數 codec qtextcodec codecforname gb18030 在每次使用中文的時候直接呼叫 codec tounicode 開啟檔案 對於中文路徑 qstring filename...
QT5中文亂碼問題
突然開啟乙個別人的工程,發現中文總是顯示不出來,qdebug 列印出來也全是?搜尋了一下解決方法,但是總解決不了。方法1 加入 qtextcodec codec qtextcodec codecforname utf 8 但是對我無效。方法2 在標頭檔案申明中加上 pragma execution ...
Qt5 中文亂碼的問題
1 如果你是linux完全不用擔心因為qt5 可以處理 utf8編碼的中文 2 假如你在window平台上使用 使用如果你在windows下,且使用的是mingw,那麼只要你將原始碼檔案儲存成utf8,前面的 將直接可以工作 無須其他設定 3 如果使用的是 msvc2005 2008 2010 20...