日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

qt5 中文乱码解决

發(fā)布時(shí)間:2023/12/1 综合教程 23 生活家
生活随笔 收集整理的這篇文章主要介紹了 qt5 中文乱码解决 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

備注:qt5取消了兩個(gè)函數(shù):
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

一、問題是什么?

在學(xué)習(xí)Qt編程的過程中,大多數(shù)人都遇到過中文亂碼的問題。總結(jié)起來有三類:

1.?Qt?Creator中顯示的漢字變?yōu)閬y碼,編輯器上方有“Could?not?decode?"..."?with?"UTF-8"-encoding.?Editing?not?possible.”的錯(cuò)誤提示。此時(shí),出現(xiàn)亂碼的文檔是不可編輯的。你好中文!”這5個(gè)中文字符變成了亂碼

2.?Qt?Creator中顯示的漢字正常,但編譯的時(shí)候會(huì)出現(xiàn)“常量中有換行符”等一系列錯(cuò)誤報(bào)警。其實(shí),這也是文字編碼的問題。如下圖所示:

?

3.?編譯時(shí)未報(bào)錯(cuò),但生成的程序中文亂碼。如下圖所示:

?

其中,第3條是網(wǎng)上提問的最多的,幾乎是所有使用MSVC的初學(xué)者都會(huì)碰到的問題。很多回答是針對Qt4版本的,Qt5中不可用。

二、為什么會(huì)出現(xiàn)這些問題?

在解決問題之前,字符編碼知識(shí)是必需的。你要知道ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16、BOM是怎么回事。此外,你還要明白源碼字符集、執(zhí)行字符集是什么。詳細(xì)內(nèi)容可以在網(wǎng)上搜索一下,俯拾即是。

1.?Qt?Creator的編輯器默認(rèn)使用UTF-8(代碼頁65001)編碼來讀取文本文件。而Visual?Studio保存文件時(shí)默認(rèn)采用的是本地編碼,對于簡體中文的Windows操作系統(tǒng),這個(gè)編碼就是GB2312(代碼頁936)。如果使用Qt?Creator讀取由Visual?Studio創(chuàng)建的文件,那么編輯器就會(huì)以UTF-8編碼格式讀取GB2312編碼格式的文件,出現(xiàn)中文亂碼,因?yàn)檫@兩套編碼系統(tǒng)對漢字編碼是不同的。至于英文部分不會(huì)亂碼,是因?yàn)閁TF-8和GB2312在單字節(jié)字符部分是兼容的。

2.?MSVC在編譯時(shí),會(huì)根據(jù)源代碼文件有無BOM來定義源碼字符集。如果有BOM,則按BOM解釋識(shí)別編碼;如果沒有,則使用本地字符集,對于簡體中文的Windows操作系統(tǒng)就是GB2312。那么,當(dāng)MSVC遇到一個(gè)沒有BOM的UTF-8編碼的文件時(shí),它通常會(huì)把文件看作GB2312的來處理。如果文件全是英文沒有問題,但如果包含中文,編譯器就會(huì)出現(xiàn)誤讀。這種情況下,Qt?Creator編輯器是正常的。但對于MSVC編譯器,原代碼會(huì)被它認(rèn)識(shí)成下圖這個(gè)樣子:

?

這是我用EverEdit指定本地編碼重讀后的結(jié)果,可以看到漢字出錯(cuò),末端的引號(hào)也沒了。

在UTF-8中,一個(gè)中文字符(漢字或標(biāo)點(diǎn)符號(hào))占用3個(gè)字節(jié),“你好中文!”這5個(gè)中文字符共占用15個(gè)字節(jié);而在GB2312中,一個(gè)中文字符(漢字或標(biāo)點(diǎn)符號(hào))占用2個(gè)字節(jié),這時(shí),MSVC把UTF-8編碼的15個(gè)字節(jié)加上后面1個(gè)字節(jié)的英文引號(hào)合成16個(gè)字節(jié)當(dāng)作8個(gè)中文字符處理。之后,MSVC在這一行里直到末尾換行符出現(xiàn)都沒有找到下一個(gè)引號(hào),它以為你把字符串在這里敲回車換行了,于是報(bào)警稱“常量中有換行符”,并引出一系列的錯(cuò)誤。

不過,當(dāng)以無BOM的UTF-8編碼的字符串正好湊夠偶數(shù)個(gè)字節(jié)時(shí)(比如偶數(shù)個(gè)漢字,或奇數(shù)個(gè)漢字加奇數(shù)個(gè)英文字母),編譯器通常不會(huì)報(bào)警,因?yàn)樗詾橛肎B2312編碼讀出的是正確的。

3.?不管源文件是何種編碼,只要MSVC能夠正確識(shí)別,就可以通過編譯。但MSVC的執(zhí)行字符集默認(rèn)是本地字符集。對我們來說,它生成的可執(zhí)行文件中的文字是GB2312編碼的。而生成的Qt程序以UTF-8編碼來識(shí)別GB2312編碼的文字,對于“你好中文!”這幾個(gè)字符,采用GB2312編碼后再以UFT-8編碼來讀取,就會(huì)變成如下的亂碼:

當(dāng)以無BOM的UTF-8編碼的字符串正好湊夠偶數(shù)個(gè)字節(jié)時(shí)(比如偶數(shù)個(gè)漢字,或奇數(shù)個(gè)漢字加奇數(shù)個(gè)英文字母),反而不會(huì)出現(xiàn)亂碼。那是因?yàn)?#xff0c;編譯器用GB2312編碼讀出的亂碼本身就是UTF-8編碼的,現(xiàn)在又用UTF-8解讀,自然就正確了。這純粹是歪打正著。

三、怎么解決這些問題?

首先,你要確定采用哪種源碼字符集。你有兩個(gè)選擇:

1.?采用本地編碼字符集(不推薦,跨平臺(tái)時(shí)會(huì)比較麻煩,但在Visual?Studio環(huán)境下配合Add-in工具編程比較方便);

2.?采用UTF-8編碼字符集(推薦,適合跨平臺(tái))。

1?“采用本地編碼字符集”方案,解決方法如下:

首先,要把項(xiàng)目中所有的頭文件和源文件全都轉(zhuǎn)換成GB2312編碼保存。

1.?第1個(gè)問題:在Qt?Creator中打開項(xiàng)目,點(diǎn)擊左側(cè)工具欄“項(xiàng)目”,在“編輯器”選項(xiàng)卡中把“默認(rèn)編碼”改成“GB2312”。如下圖所示:

?

話說回來,既然選擇本地字符集,大致上是放棄跨平臺(tái)了。與其用輕量級(jí)的Qt?Creator,不如用Visual?Studio作開發(fā)環(huán)境更好。

2.?第2個(gè)問題:“常量中有換行符”等一系列報(bào)警已不存在了。

3.?第3個(gè)問題:在字符串常量上加QStringLiteral宏或QString::fromLocal8Bit函數(shù),如:

QString?str?=?"你好中文!";

改為:

QString?str?=?QStringLiteral("你好中文!");

或者:

QString?str?=?QString::fromLocal8Bit("你好中文!");

不過,在這兩種形式下,你都無法用tr方法來創(chuàng)建翻譯了。

2?“采用UTF-8編碼字符集”方案,解決方法如下:

首先,要把項(xiàng)目中所有的頭文件和源文件全都轉(zhuǎn)換成UTF-8+BOM編碼保存。

1.?第1個(gè)問題不存在了。

2.?第2個(gè)問題也不存在了。

3.?第3個(gè)問題,你也可以用上個(gè)方案中的方法來解決,但有更好的方法。那就是要用到中文字符的頭文件和源文件開頭加上MSVC的一個(gè)宏:

#if?_MSC_VER?>=?1600

#pragma?execution_character_set("utf-8")

#endif

這個(gè)宏告訴MSVC,執(zhí)行字符集是UTF-8編碼的,別瞎整成GB2312的!還有個(gè)好處,就是能用tr包中文,方便日后的翻譯。最終效果如下:

?

FROM: ?http://liuweilhy.blog.163.com/blog/static/11405670201510901627229/

總結(jié)

以上是生活随笔為你收集整理的qt5 中文乱码解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。