Qt中的中文編碼

在windows下的記事本中輸入“我a”,分別以ANSI、Unicode、UTF-8保存,然後用16進制打開:

 

ANSI:ced2 61

 

Unicode:fffe 1162 6100    (fffe是記事本用於標識是unicode編碼的標識符)

 

UTF-8:efbb bfe6 8891 61       (efbb bf是記事本用於標識是utf-8編碼的標識符)

 

ANSI編碼(默認):英文1個字節,中文2個字節,即一個字節最高爲1時,與後一個字節合併組成雙字節,爲一個字符,否則爲ASCII字符。

 

Unicode:無論中英文,每個都是2個字節。

 

UTF-8:英文1個字節,中文3個字節。

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Windows中的Qt Creator的編輯器本身使用的是操作系統默認的編碼,與記事本一樣也是ANSI編碼,可以用16進制編譯器打開源文件比對中文字符對應的二進制數據。

上面QString str("我a");

“我a”實際的16進製爲:ced261,ced2是‘我’,61是'a'

而QString內部是以Unicode形式保存的。

QString得到的是由編譯器送給的數據"ced261",顯然在保存成unicode前,必須進行編碼轉換。

而Qt對常量字符串(雙引號內的字符串)默認是認爲Latin-1編碼的,該編碼用於歐洲文字(最高位爲1時是比如希臘字母等之類的),都是以1個字節表示的,所以在對”我a“,保存進QString時,認爲是3個字符ce 、d2和61。此時QString的size是3,內部則爲0x00ce、0x00d2、0x0061 這3個字符。

 

要正確保存成Unicode,則需要制定對於常量字符串的編碼。通過QTextCodec::setCodecForCStrings(QTextCodec *c)來設定。

c代表常量字符串的編碼,默認就是Latin-1。

當c爲QTextCodec::codecForLocale()時,就是當前時區的編碼(一般操作系統指定)。

所以在main函數開始出添加語句QTextCodec::setCodecForCStrings( QTextCodec::codecForLocale()); 後就可以使QString轉換時識別文本編輯器的編碼,而不是Latin-1。

可以發現,此時QString內size爲2,第一個字符16進製爲6211與記事本中保存”我“的unicode一致。

另外可以看到,QChar賦值使用單引號時,仍舊沒有正確的進行轉換,導致在QString append ’我'這個QChar後,最後一個’我‘,仍舊無法正常顯示。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章