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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

vs2010 qt中文乱码 最终版

發(fā)布時(shí)間:2025/3/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vs2010 qt中文乱码 最终版 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2020.11.27?最后終于把這玩意里理解明白了,可能是翻譯引起的理解差異吧。微軟對(duì)此做出的解釋:

對(duì)于vs編譯器來(lái)說(shuō),有兩個(gè)概念:

源字符集

執(zhí)行字符集

對(duì)于vs2010 sp1-VS2015,引入指令#pragma execution_character_set("utf-8"),這只是將執(zhí)行字符集設(shè)為UTF-8,然而源碼字符集僅僅支持UTF-16 little bom、UTF-16 big、UTF-8 with BOM,你的文件格式UTF-8它就不支持,自己又去轉(zhuǎn)換了,所以必定亂碼,想不亂碼,必須源碼文件格式保存UTF-8?BOM (VS文件格式中叫 Unicode (UTF-8帶簽名))或者?簡(jiǎn)體中文格式 (linux等別的平臺(tái)不支持);
);

在VS2015版本(Visual Studio 2015 Update 2)及其之后,微軟放棄了上面的編譯指令,新增編譯選項(xiàng)/utf-8,只需要這一個(gè)命令就將源碼字符集和執(zhí)行文件字符集都指定為UTF-8,所以文件格式并不重要了,一個(gè)編譯執(zhí)行命令,文件編碼格式UTF-8?BOMUTF-8、?簡(jiǎn)體中文格式三個(gè)都不會(huì)亂碼了,當(dāng)然優(yōu)選UTF-8跨平臺(tái)換編譯器等都支持?;

//vs2015?updater2以后以下兩個(gè)編譯命令等同于這一個(gè)命令 /utf-8

/source-charset:utf-8? ? ?源碼字符集設(shè)為utf-8

/execution-charset:utf-8? ?執(zhí)行字符集設(shè)為UTF-8


//兩個(gè)基礎(chǔ)概念

UTF-8?BOM? ==?Unicode (UTF-8帶簽名)?

UTF-8 ==?Unicode UTF-8無(wú)簽名? ? ?//linux等平臺(tái)默認(rèn)支持此。
?

搞清楚以上這幾個(gè)概念,再去看微軟官方文檔,便一目了然了。

https://docs.microsoft.com/en-us/cpp/preprocessor/execution-character-set?view=msvc-160

方法如下:

文件編碼格式方法

結(jié)論:

1、vs2015?updater2-vs2019,只在vs版本下開(kāi)發(fā),想保持兼容性,文件編碼格式建議采用UTF-8?BOM最省事,vs商店有插件ForceUTF8 (with BOM);

2、需要跨平臺(tái)、庫(kù)、算法涉及到跨平臺(tái)、linux、換編譯器,文件編碼格式建議UTF-8,只能手動(dòng)設(shè)置;

3、vs2010?sp1-vs2015 ,別想了,只能用UTF-8?BOM!


2020.11.26重新思考后,查看了,微軟官方文檔:

vs編輯器可以區(qū)分utf-8和utf-8 bom等,可編譯器不認(rèn)賬,如果你不是這三個(gè)中的一個(gè)UTF-16 little bom、UTF-16 big、UTF-8 with BOM它就自做主張按默認(rèn)處理,那你要么編譯中文亂碼要么qt的ui中文亂碼。

https://docs.microsoft.com/en-us/previous-versions/xwy0e8f2(v=vs.140)?redirectedfrom=MSDN

也可以看看此試驗(yàn),作者寫的很詳細(xì):

https://blog.csdn.net/qq_33154343/article/details/78686075?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-1-78686075.nonecase&utm_term=qt%20%E4%B8%AD%E6%96%87%E6%B3%A8%E9%87%8A%E9%80%A0%E6%88%90%E7%BC%96%E8%AF%91%E4%B8%8D%E9%80%9A%E8%BF%87&spm=1000.2123.3001.4430


2020.11.25? 對(duì)編碼格式報(bào)錯(cuò)產(chǎn)生疑問(wèn),為什么文件編碼格式utf-8 vs2010就報(bào)錯(cuò)?明明QT默認(rèn)就是這個(gè)格式?……

要搞清楚這個(gè)問(wèn)題,先要弄明白編碼。但是編碼問(wèn)題實(shí)在太復(fù)雜,這里肯定講不開(kāi)。

我先找一個(gè)例子,比如:"中文" 的 Unicode 碼點(diǎn)/UTF8編碼/GBK 分別是多少。

先去這個(gè)網(wǎng)站,輸入 "中文" 查詢對(duì)應(yīng)的 Unicode 碼點(diǎn)/UTF8編碼:
http://www.mytju.com/classcode/tools/encode_utf8.asp

Unicode的碼點(diǎn)分別是(十進(jìn)制):中(20013),文(25991)。
對(duì)應(yīng)的UTF8編碼分別(16進(jìn)制): 中(E4B8AD),文(E69687)。

然后再去下面這個(gè)網(wǎng)站,輸入 "中文" 查詢對(duì)應(yīng)的 GBK 編碼:
http://www.mytju.com/classcode/tools/encode_gb2312.asp

GBK編碼16進(jìn)制(GBK內(nèi)碼)分別是:中(D6D0),文(CEC4)。

現(xiàn)在已經(jīng)知道了"中文"的UTF8和GBK編碼的具體值。
我們?cè)倏纯碫C2010是怎么處理的。
?

1. 先看 無(wú) BOM 的 UTF8 編碼的代碼 (utf8_no_bom.cpp)

// utf8 no bom // 文件中包含不能在當(dāng)前代碼頁(yè)(936)中表示的字符 #include <stdio.h>int main() {const char* str = "中文";for(int i = 0; i < sizeof(str); ++i) {printf("0x%x ", str[i]&0xFF);}return 0;// Output:// 0xe4 0xb8 0xad 0xe6 }

輸出是:0xe4 0xb8 0xad 0xe6。
感覺(jué)好像是對(duì)的。

但是,先別急:VC編譯時(shí)輸出了一條警告信息:
utf8_no_bom.cpp : warning C4819: 該文件包含不能在當(dāng)前代碼頁(yè)(936)中表示的字符。
請(qǐng)將該文件保存為 Unicode 格式以防止數(shù)據(jù)丟失。

潛臺(tái)詞就是,你這個(gè)代碼有GBK不能表示的字符,請(qǐng)用Unicode方式保存。
VC根本就沒(méi)把 代碼(utf8_no_bom.cpp) 當(dāng)作UTF8,VC只是把它作為GBK處理罷了。

那為什么又輸出了正確的結(jié)果呢?

因?yàn)?VC 把 (utf8_no_bom.cpp) 當(dāng)作 GBK,而編譯時(shí)也要轉(zhuǎn)換為本地編碼(也是GBK)。因此,UTF8編碼的 "中文",被VC當(dāng)作編碼GBK編碼的 "0xe4 0xb8 0xad 0xe6" 的字符串處理了(肯定不是"中文"含義了)。

?

VC已經(jīng)不知道 "0xe4 0xb8 0xad 0xe6" 是對(duì)應(yīng) "中文" 字面值了。

但是在GBK(實(shí)際是無(wú)BOM的UTF8)轉(zhuǎn)GBK的過(guò)程中,發(fā)現(xiàn)了一些UTF8編碼的字符并不是GBK能表達(dá)的合理方式,因此就出現(xiàn)了那個(gè)C4819編譯警告。

2. 再看帶BOM的UTF8是怎么處理的 (utf8_with_bom.cpp)

// utf8 with bom #include <stdio.h>int main() {const char* str = "中文";for(int i = 0; i < sizeof(str); ++i) {printf("0x%x ", str[i]&0xFF);}return 0;// Output:// 0xd6 0xd0 0xce 0xc4 }

?

編譯沒(méi)有警告,但是輸出有問(wèn)題:0xd6 0xd0 0xce 0xc4。

源文件明明是 UTF8 編碼的格式"0xe4 0xb8 0xad 0xe6",
怎么變成了 "0xd6 0xd0 0xce 0xc4" (這個(gè)是GBK編碼)?

這就是VC私下干的好事:它自作聰明的將UTF8源代碼轉(zhuǎn)換為GBK處理了!

VC為何要做這樣蠢事?

原因是為了兼容老的VC版本。
因?yàn)橐郧暗腣C不能處理UTF8,都是用本地編碼處理的。

3. 在看看真的GBK是怎么處理的 (gbk.cpp)

// gbk #include <stdio.h>int main() {const char* str = "中文";for(int i = 0; i < sizeof(str); ++i) {printf("0x%x ", str[i]&0xFF);}return 0;// Output:// 0xd6 0xd0 0xce 0xc4 }

沒(méi)有編譯錯(cuò)誤,輸出也和源代碼一致:"0xd6 0xd0 0xce 0xc4"。

因?yàn)樵次募褪荊BK,cl在編譯時(shí)GBK轉(zhuǎn)化為GBK,沒(méi)有改變字符串。

只是,現(xiàn)在很多人不想用GBK了(因?yàn)橹荒茉谥袊?guó)地區(qū)用,不能表示全球字符)。

------

到這里,可以初步小結(jié)一下:

1. VC編輯器和VC編譯器是2個(gè)概念,VC編輯器支持UTF8并不能表示VC編譯器也支持UTF8
2. VC編輯器從2008?開(kāi)始支持帶BOM的UTF8(不帶BOM的暫時(shí)沒(méi)戲,因?yàn)闀?huì)本地編碼沖突)
3. VC編譯器從2010開(kāi)始也可以支持UTF8了(雖然支持方式很不優(yōu)雅)

------
?

繼續(xù)前面的測(cè)試,

看看VC2010編譯器是怎么支持帶BOM的UTF8的 (utf8_with_bom_2010.cpp)

// utf8 with bom (VC2010), 下面這句是重點(diǎn)! #pragma execution_character_set("utf-8")#include <stdio.h>int main() {const char* str = "中文";for(int i = 0; i < sizeof(str); ++i) {printf("0x%x ", str[i]&0xFF);}return 0;// Output:// 0xe4 0xb8 0xad 0xe6 }

沒(méi)有編譯錯(cuò)誤,輸出也和源代碼一致:"0xe4 0xb8 0xad 0xe6"。

UTF8編碼,UTF8輸出。完美!

------

回到 Qt5 的中文輸出問(wèn)題。

Qt默認(rèn)支持 VS2010/MinGW/Gcc 等編譯器,而它們現(xiàn)在都已經(jīng)真正支持UTF8了。

當(dāng)然,VS2010 對(duì)UTF8的支持會(huì)入侵代碼(#pragma execution_character_set("utf-8"))。

看看Qt官方論壇別人是怎么說(shuō)的:
http://qt-project.org/forums/viewthread/17617
?

Nothing special need to do, it will works by default. If the exec-charset of your your compiler is UTF-8.


簡(jiǎn)單的說(shuō),從Qt5開(kāi)始,源代碼就是默認(rèn)UTF8編碼的。

當(dāng)然,VC2010編輯器對(duì)帶BOM的UTF8也是認(rèn)識(shí),只可惜VC2010編譯器根本不認(rèn)識(shí)!

在繼續(xù)看官方論壇的回復(fù):

You can write a simple example like this#include <QApplication> #include <QLabel>#if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endifint main(int argc, char *argv[]) {QApplication a(argc, argv);QLabel label("???ó??ń??");label.show();return a.exec(); }If other people can reproduce your problem, you can file a bug.

總結(jié)

以上是生活随笔為你收集整理的vs2010 qt中文乱码 最终版的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

主站蜘蛛池模板: 天天综合网久久 | 99免费在线观看视频 | 一级免费在线观看 | 魔女鞋交玉足榨精调教 | 超碰免费成人 | 91在线视频 | 中文字幕7 | 成人一级视频 | 午夜激情福利视频 | 亚洲精品2| 日韩美女爱爱 | 中文字幕第四页 | 国产精品黄在线观看 | 91国语对白 | 人人玩人人弄 | 日本一区二区在线观看视频 | 动漫羞羞| 欧美搞逼视频 | 日本不卡一二三区 | 午夜影院免费观看 | 亚洲风情第一页 | 操操网站 | 一区二区三区四区精品 | 国产成人无码AA精品区 | 97超碰资源站 | 精品人妻久久久久久888不卡 | 黑人操中国女人视频 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 久久久久久久久蜜桃 | 顶级尤物极品女神福利视频 | 亚洲一区二区久久 | 亚洲欧洲日韩综合 | 超碰免费av | 露脸丨91丨九色露脸 | 激情综合网激情 | 欧美一区二区三区系列电影 | 18禁裸男晨勃露j毛免费观看 | 欧美成人r级一区二区三区 中文无码一区二区三区在线观看 | 丰满岳跪趴高撅肥臀尤物在线观看 | www.欧美色 | 国产女人被狂躁到高潮小说 | 黄色激情在线观看 | 免费在线观看黄色 | 久久人妖 | 日日夜夜免费精品视频 | av一区二 | 国产精品正在播放 | 日韩精美视频 | 91精品久久久久久粉嫩 | 成人动漫视频在线观看 | 日本三级中文字幕 | 一级片日韩 | 秋霞欧美在线观看 | 久久精品视频免费看 | 日韩综合色 | 在线免费看毛片 | 蜜乳av懂色av粉嫩av | 越南性xxxx精品hd | japanese24hdxxxx中文字幕 | 国产亚洲小视频 | 亚洲黄色免费视频 | 色婷av | av免费观看大全 | 欧美性久久 | 中文字幕免费在线 | 老牛影视av老牛影视av | 亚洲成人手机在线 | 免费成人看视频 | 一本大道熟女人妻中文字幕在线 | 在线观看污视频网站 | 国产高潮呻吟久久 | 国产日韩欧美中文字幕 | 懂色tv| 亚洲一区在线电影 | 久久国产91 | 久久精彩视频 | 欧美一区二区三区四区在线 | 在线视频免费观看 | 成长快手短视频在线观看 | 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | 好看的av网址 | 不卡中文字幕 | 极品尤物魔鬼身材啪啪仙踪林 | 青娱乐91视频 | 日本妈妈9 | 国产地址一 | 亚洲粉嫩 | 欧美成人一区二区三区高清 | 九色在线播放 | 欧美大片一区 | 精彩毛片 | 黄网在线观看视频 | 天堂资源最新在线 | 国产伦精品一区 | 1024福利| 中文字幕15页 | 国产精品精品软件视频 | 三上悠亚人妻中文字幕在线 | 日女人免费视频 |