精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

徹底解決QT中文碼亂問題

系統 Windows
讀完本文,讓你徹底明白Windows下中文亂碼的問題。一勞永逸地解決這個困擾很多同學的問題。

[[438437]]

讀完本文,讓你徹底明白Windows下中文亂碼的問題。一勞永逸地解決這個困擾很多同學的問題。

前言

在桌面開發過程中,由于Qt的跨平臺特性,以及更加先進的庫封裝。比起MFC,用著不知道要爽多少。Qt獨創的信號槽機制,也大大方便了開發者。可以讓開發者把更多的精力放在業務的邏輯上,而不是語言和庫的各種細節上。

可是,在使用的過程中,不少朋友在中文Windows系統下,遇到了亂碼的問題。著實頭痛,網上搜了一圈,有時能解決問題,有時不知道什么原因的情況下又出現了奇怪的問題。同樣的問題在cocos2d-x中也會出現。

小伙伴們不要灰心,這個問題連大佬們都頭痛。哈哈~~,請看下面的案例。

上面的問題來自《Cocos2d-x實戰:C++卷》,大佬也很無奈啊。

今天,讓我們來自己剖析一下這個問題。并最終找到一勞永逸的解決方案。

在開始前,我們先來羅列一下遇到的幾種情況:

  1.  完全正常。(人品大爆發啊)
  2.  直接亂碼。(哎,時運不濟)
  3.  編譯報錯——C4819,C2001、C2143。(這是犯了什么天條了嗎?) 
  4.  很小心的使用,可能正常。有時正常,有時編譯報錯,有時末尾的字是亂碼,前面的正常。(這是什么鬼啊)。

              細心的小伙伴還總結出了,偶數個中文字符正常,奇數個就不行了。后面再加個英文字符,前面的顯示正常,后面一個字符亂碼。(我也太難了吧~~~)

一、字符編碼

要徹底理解這個問題,我們需要從字符編碼說起,小伙伴們稍微有點耐心,這個其實很容易理解。字符編碼說白了就是一張對照表。

1.1 ASCII編碼

這個編碼很容易,就用了一個字節進行編碼,只能表示英文字符和標點符號。這里我就不過多贅述了,百度一下,就有很多文章有詳細講解。

ASCII編碼表

1.2 中文編碼

計算機剛開始被發明的時候,只有ASCII編碼。也就是說只有英文,那我們怎么辦呢?沒有人幫我們做,那只有自己來了,在1980年,國家標準總局發布了GB2312,其實就是一張中文的編碼對照表。這也不是很復雜的東西,因為單個字節只有256種可能,也就是說,最多只能表示256種字符。那么我們就再多用一個字節唄,在GB2312中,中文就用2個字節進行表示。2^16 = 65536,有這么多種可能,編碼漢字綽綽有余了。

當然,考慮到兼容ASCII編碼,當第一個字符數字小于127時,就表示ASCII字符,用一個字節就夠了。當遇到第一個字符大于127時,就要結合第二個字符來決定是哪個中文字符了。

剛開始GB2312把6000多個中文編了進去,后來發現不夠用,又增加了20000多個字符(包括繁體字),編碼方案名稱改為GBK。再后來,又增加了幾千個少數民族字符,編碼方案名稱改為GB18030。到這里,我們就知道GB2312、GBK、GB18030的編碼方式是一脈相承的。為了后面敘述的方便,我們統稱這種為GBK編碼。

1.3 Unicode編碼

在中國使用GBK編碼方案的同時,其他國家和地區為了使用自己的文字,也紛紛進行對自己的語言文字進行編碼。造成的結果就是,不通用!不同語音的操作系統下編輯的文檔,在另一臺不同語音的計算機中打開就是亂碼。

隨著全球化的發展,急需一種統一的編碼方案,來解決這種混亂的局面。

最終,ISO拿出了Unicode編碼,廢棄所有地區性的編碼方案。重新編碼,所有的字符統一采用2個字節進行存儲。

GBK編碼方案和Unicode編碼完全不同,這也是亂碼的根源。

[[438438]]

[[438439]]

[[438440]]

[[438441]]

二、文件編碼

2.1 UTF-8編碼

雖然上文中講到ISO將字符進行了重新編碼,并發布了Unicode。每個字符采用2個字節,16位進行編碼。對于使用英語的國家來說,原來采用的是ASCII編碼,那么所有的文件大小都會變成原來的2倍。這個浪費太大了,于是UTF-8就出現了。

如果用語言描述UTF-8,有些復雜。我們來舉個例子,就很容易明白了。

比如,“中”這個字,Unicode編碼為:0x4E2D。用二進制寫就是(0100-1110-0010-1101),那么用UTF-8,怎么進行表示呢?

 1110 0100

 1011 1000

 1010 1101

我來解釋一下,第一個字節,前面的4位中有連續的3個1,表示這個字符需要有3個字節組成。

第二個字節,前面的2位10,表示上接前面的字節,后面的6位是編碼。

第三個字節同第二個字節,前面的10和后面的編碼。

也就是說,16位的Unicode編碼,被分散到3個字節中。

好麻煩啊……的確,遇到中文或其他多字節編碼的字符是有點麻煩,但是如果是英文字符,直接就用ASCII編碼保存了。直接完全兼容原來的英文文檔,他們就是有這么多的優越性,沒辦法,畢竟計算機技術來自他們那兒。

2.2 ANSI編碼

這又是什么編碼?細心的小伙伴會發現,你在Windows系統上用記事本編輯完文件,點另存為的時候,右下角默認的編碼就是ANSI。這是Windows為了兼容各種不同的編碼,而這樣做的。

其實,他的做法非常簡單,如果遇到小于127的編碼,就是ASCII編碼,計算機都認識這個編碼,對于大于127的編碼,也不用管那么多了,按原樣保存就行了。

 

[[438442]]

[[438443]]

[[438444]]

[[438445]]

三、一勞永逸地消除亂碼

在解決問題前,我們再稍微了解一些背景知識,小伙伴們不要著急啊!

3.1 UTF-8和UTF-8-BOM

UTF-8都夠復雜了,還來個UTF-8-BOM??

其實,不必擔心,這個也是非常簡單的。

讓我們先來看個例子:

上圖,我們在記事本中寫入“中文”,然后,以utf-8保存。

再用notepad++查看存入的內容,以十六進制顯示。這樣沒有問題。

但是,如果再次打開,還會正確顯示嗎?記事本怎么知道我們是按utf-8存儲的呢?如果這個十六進制的串,用GBK解碼就是“涓枃”,是不是有點眼熟啊?我們遇到亂碼的時候,也經常是這種類似的字符。

現在,記事本工作得好好的,但是他有些時候會不會認錯呢?還真會,用記事本新建一個文本文件,輸入“聯通”,保存,再打開。你是不是看到了微軟對聯通滿滿的惡意?哈哈O(∩_∩)O哈哈~

其實,各種軟件在處理文本文件的時候,經常會搞錯!為了解決這種問題,就引入了utf-8-bom。

做法非常簡單,在utf-8文件的開頭加入ef bb bf 三個字節,標示這是一個utf-8的文件,告訴軟件,你可別認錯了。

3.2 編輯器和編譯器對文件的處理

在Qt5 + VS的環境中,編輯器對于我們的源文件解析的完全沒有問題。

可惜的是VS的編譯器卻不是像我們想像的進行工作的。

VS的編譯器經常認錯utf-8文件為ANSI文件,曾經有小伙伴把這個問題,向微軟提交了這個bug,得到的回復如下

The compiler when faced with a source file that does not have a BOM the compiler reads ahead a certain distance into the file to see if it can detect any Unicode characters - it specifically looks for UTF-16 and UTF-16BE - if it doesn't find either then it assumes that it has MBCS. I suspect that in this case that in this case it falls back to MBCS and this is what is causing the problem.

翻譯過來,就是當編譯器遇到不帶BOM的utf-8文件,會讀入一部分進行判斷是否UTF-16和UTF-16BE,如果不是就按照MBCS方式處理。

它根本就不進行utf-8文件的判斷啊,Qt默認保存的就是utf-8文件,并且不帶bom。然后,被按照MBCS方式識別,在我們的環境中,就是按照ANSI方式來處理。

好家伙,,,這么偷懶啊,造成了我們無窮的麻煩……

之前微軟為了這個問題,還出過在文件開頭加上#pragma execution_character_set("utf-8")的方式,后來也被廢棄了。

到這里,我們明白了,Qt默認保存的utf-8文件(不帶bom),被VS的編譯器認成了ANSI格式的文件,就是亂碼的根源。

3.3 Qt中QString對中文的處理

Qt中有QString字符串類,使用非常方便。

經常我們使用2種常用的方式:

QString str1("中文");

QString str2 = QString::fromLocal8Bit("中文");

需要明確的是第一種方法,也就是QString默認構造函數,接受的是utf-8字節序列。第二種方法,接受的是GBK字節序列。

3.4 解決方案

到這里為止,相信大家對怎么解決中文亂碼的方案已經猜出來了。那就是:

在Qt中設置所有保存的文件都是utf-8-bom格式

在需要使用到中文的地方需要使用QString::fromLocal8Bit()方式。

3.5 編譯出錯的問題

到這里,細心的小伙伴就會意識到,雖然,我們亂碼的問題得到了解決,但還是不明白前面4種現象中的后兩種是什么情況。這里,我就再給大家解釋一下。

char * str = "中文中";

看上面的代碼,如果我們保存在utf-8文件中,而編譯器把我們的文件認成了ANSI格式的,也就是中文部分安裝GBK來解析。我們看“中文中”這三個字的utf-8編碼

e4 b8 ad e6 96 87 e4 b8 ad

三個中文字符被編碼成了9個字節,在編譯器按照GBK編碼進行解析,因為GBK編碼中,中文字符需要兩個字節,就把后面的分號就給吞噬掉了。源文件少了個分號,編譯肯定是通不過的。

還剩最后一個問題,如果是

 char * str = "中文中 ";

后面多添了一個空格,引號中的utf編碼為:

e4 b8 ad e6 96 87 e4 b8 ad 20

剛好是10個字節,所以,編譯沒有報錯,但是在編譯器編譯的過程中,是按照GBK進行解析的,到解析到最后,遇到ad 20,發現找不到GBK中對應的字符,就把ad 20用3f(?),替代。

QString接收到的字符序列變為:

e4 b8 ad e6 96 87 e4 b8 3f

所以,QString接收到的utf-8序列最后一個字節被改掉了,最后一個字符就顯示出了亂碼了。

其實,文章的開頭提到的第1種沒有問題的情況,很有可能,程序比較簡單,而中文字符出現的個數剛好是偶數。真是人品大爆發,在發生2次誤解的情況下,得到了正確的結果。O(∩_∩)O哈哈~

[[438447]]

[[438448]]

[[438449]]

[[438450]]

四、總結

今天,我們介紹了各種字符編碼,文件存儲編碼,VS編譯器,以及QString對字符的處理。總算理順了出現亂碼的原因。最終的原因,就是Qt默認保存為utf-8不帶bom的文件,而VS編譯器對于utf-8文件解析過程中的偷懶,而錯認為ANSI編碼文件所致。Cocos2d-x中的亂碼,相信小伙伴們也已經明白是怎么回事了。 

 

責任編輯:龐桂玉 來源: 良許Linux
相關推薦

2009-12-03 18:45:41

2009-11-27 10:31:02

GPRS路由

2023-02-27 08:08:54

Pulsar源碼重復消費

2025-03-03 00:13:50

2010-01-04 15:05:53

2023-11-28 08:36:16

Spring中Body讀取

2010-01-11 18:05:24

VB.NET窗體繼承

2025-06-17 06:40:45

DockerDocker鏡像

2010-01-14 10:19:05

2009-12-25 09:39:08

ADSL MODEM

2025-08-07 02:45:00

2009-11-24 19:50:10

2022-10-08 23:55:58

iOS蘋果開發

2011-06-29 18:02:58

Qt 中文 翻譯

2011-06-13 16:16:32

Qt 中文問題

2009-12-21 17:20:19

2022-05-31 09:01:13

GitHub工具安全

2009-12-04 16:25:24

2020-09-28 14:41:24

Event Loop

2009-12-03 16:54:04

無線寬帶路由器
點贊
收藏

51CTO技術棧公眾號

国内精品久久久久影院薰衣草 | 久久精品五月| 欧美日韩精品一区二区三区 | 麻豆蜜桃在线| 日韩精品一区二区三区免费观看| 一区二区三区中文在线| 国产精品va在线播放我和闺蜜| 麻豆传媒在线看| 国产精品传媒在线观看| 久久综合五月婷婷| 亚洲国产色一区| 亚洲在线免费视频| 亚洲不卡在线播放| 色综合一区二区日本韩国亚洲| 久久先锋影音av鲁色资源| 国内精品小视频| 日本一区二区免费视频| 午夜av在线免费观看| 国产在线精品一区在线观看麻豆| 中文字幕精品www乱入免费视频| 欧美牲交a欧美牲交aⅴ免费真| 丰满熟女一区二区三区| 国产一区二区三区自拍| 日韩一级大片在线| 777久久精品一区二区三区无码| 国产又大又黑又粗| 7777久久香蕉成人影院| 欧美精品日韩精品| 99精品一区二区三区的区别| 国产手机视频在线| 国产精品国码视频| 色婷婷久久av| 免费欧美一级片| 97精品国产综合久久久动漫日韩 | 日韩激情av在线免费观看| 黄色激情在线视频| 亚洲AV成人无码一二三区在线| 日韩五码在线| 亚洲欧美制服综合另类| 爆乳熟妇一区二区三区霸乳| h视频网站在线观看| 久久精品二区亚洲w码| 米奇精品一区二区三区在线观看| 欧美老女人bb| 超级碰碰不卡在线视频| 91偷拍与自偷拍精品| 国产精品极品美女在线观看免费| 国产一级一级片| 国产精品嫩草影院在线看| 欧美天堂一区二区三区| 好吊色这里只有精品| melody高清在线观看| 久久久久一区二区三区四区| 国产乱肥老妇国产一区二| 日韩一级片av| 欧美91在线| 欧美日韩久久久一区| 日本免费观看网站| 深夜国产在线播放| 一区二区三区 在线观看视频| 精品欧美一区二区久久久伦| 中文字幕天堂在线| 欧美成人有码| 亚洲色图欧美制服丝袜另类第一页| 波多野结衣视频播放| 99精品国自产在线| 7878成人国产在线观看| 国模无码视频一区二区三区| 日韩黄色影院| 99国产精品久| 91在线精品播放| 久久精品视频2| 日本免费新一区视频| 久久久天堂国产精品女人| 男人天堂中文字幕| 91精品啪在线观看国产18| 久久精品国产亚洲7777| 香蕉视频黄色在线观看| 蜜桃精品视频| 欧美在线三级电影| 久久黄色片视频| 99自拍视频在线观看| 久久精品视频一区二区| 亚洲高清精品中出| 日韩毛片在线一区二区毛片| 国产成人丝袜美腿| 91精品国产综合久久久久久久久 | 亚洲精品第二页| 国产精品第一国产精品| 欧美一区二区精品在线| 男人插女人下面免费视频| 国产一区高清| 色综合久久中文综合久久牛| 精品无码国产一区二区三区av| 九色porny自拍视频在线观看| 亚洲精品国产精华液| www.在线观看av| 99在线视频观看| 午夜久久久久久久久| www.国产二区| 国模套图日韩精品一区二区| 第一福利永久视频精品| 日韩a级在线观看| www.国产精品| 亚洲成人xxx| 任你躁av一区二区三区| 国产不卡一二三区| 欧美激情第三页| 国产高潮流白浆| 午夜精品一区二区三区国产| 97视频在线观看免费| 日韩女同强女同hd| 国产精品乱看| 欧日韩在线观看| 亚洲欧美精品一区二区三区| 国产精品亚洲综合色区韩国| 国产在线a不卡| 欧美一区二区少妇| 亚洲综合男人的天堂| 久久婷婷综合色| 色综合一区二区日本韩国亚洲| 日韩大陆毛片av| 成人免费看片98| 在线综合欧美| yellow视频在线观看一区二区| va婷婷在线免费观看| 国产激情一区二区三区桃花岛亚洲| 欧美一进一出视频| 91精彩在线视频| 中文字幕在线一区| 国内自拍中文字幕| av资源中文在线| 色老综合老女人久久久| 日日噜噜噜噜久久久精品毛片| 国内毛片久久| 亚洲天堂av网| av大片免费在线观看| 丰满岳乱妇一区二区三区| 久久国产精品免费一区| www.亚洲.com| 欧洲一区在线电影| 白白色免费视频| 亚洲精品一区二区妖精| 欧美xxxx18国产| 国产精品自拍电影| 亚洲欧美日韩综合aⅴ视频| www.日本少妇| 丁香综合av| 久久免费国产视频| 黄色av网址在线| 亚洲电影第三页| 青青草视频网站| 一本久道综合久久精品| 精品伦理一区二区三区| 免费在线小视频| 亚洲视频欧洲视频| 中文字幕一区二区人妻视频| 国产老肥熟一区二区三区| 国产日韩欧美精品| 在线免费观看黄色网址| 欧美在线视频你懂得| 最新黄色av网址| 亚洲在线日韩| 亚洲综合国产精品| 日韩三级免费| 日韩精品高清在线| 无码人妻精品一区二区三区不卡| 国产欧美1区2区3区| 欧美中日韩在线| 国产精东传媒成人av电影| 91精品国产网站| 国产精品一区二区三区在线免费观看 | 日本精品一二三| 国产欧美一区二区色老头| 日本高清久久一区二区三区| 国产成人精品一区二区三区视频 | 欧美人与禽zozzo禽性配| 亚洲一区二区免费看| 欧美亚洲免费在线| 啦啦啦中文在线观看日本| 亚洲国产成人精品久久| 不卡av电影在线| 亚洲品质自拍视频| 一级国产黄色片| 国产精品v亚洲精品v日韩精品 | 婷婷伊人综合中文字幕| 亚洲柠檬福利资源导航| 韩国日本美国免费毛片| 99精品美女| 国产精品一区二区三区在线播放 | 成人黄色免费片| 欧美美女色图| 精品日韩中文字幕| 极品尤物一区二区| 日本成人在线视频网站| 久久www视频| 国产区精品区| 97人人模人人爽视频一区二区 | 日本成人7777| 91精品国产综合久久香蕉的用户体验 | 亚洲免费福利一区| 97在线日本国产| av在线女优影院| 亚洲电影免费观看高清完整版在线观看| 天干夜夜爽爽日日日日| 一区二区三区四区av| 蜜桃传媒一区二区亚洲| 成人美女视频在线观看18| 欧美一级爱爱视频| 精品国产精品国产偷麻豆| 456国产精品| 四虎影视在线播放| 欧美日韩综合视频网址| 女~淫辱の触手3d动漫| 国产精品一区二区无线| 波多野结衣天堂| 一区二区福利| 很污的网站在线观看| 欧美aaaaa级| av蓝导航精品导航| 五月天色综合| 国产精品视频1区| 黄色在线播放网站| 欧美一区二区视频网站| 波多野结衣黄色| 午夜免费久久看| 久久精品性爱视频| 一区二区三区鲁丝不卡| 91精品少妇一区二区三区蜜桃臀| 国产久卡久卡久卡久卡视频精品| 成人黄色一区二区| 鲁大师成人一区二区三区| 无码专区aaaaaa免费视频| 狠狠入ady亚洲精品经典电影| 视频一区二区视频| 粉嫩久久久久久久极品| 999在线免费观看视频| 亚洲综合视频| 韩国精品美女www爽爽爽视频| 国产日产一区二区| 久久视频在线视频| 天堂在线视频免费| 亚洲国产91色在线| 天堂成人在线| 亚洲另类图片色| 国产有码在线观看| 五月天一区二区| 国产熟女一区二区| 国产精品一品二品| 久久综合桃花网| 久久久天天操| 一本大道东京热无码aⅴ| 在线电影一区二区| 日韩国产成人无码av毛片| 欧美日韩三级| 手机成人在线| 成人三级av在线| 国产美女主播一区| 日韩成人精品一区二区三区| 成人国产精品久久久| 国产免费av国片精品草莓男男| 午夜精品一区二区三区在线视| 黄色污污视频在线观看| 欧美精品videos另类日本| 成a人v在线播放| 日韩在线不卡视频| 天堂资源最新在线| 国产亚洲福利一区| 后进极品白嫩翘臀在线视频| 亚洲国内精品在线| 国产三级在线观看视频| 日韩美女在线视频| 一级aaaa毛片| 日韩欧美在线免费| 最新中文字幕免费| 欧美一级黄色片| 天天干天天舔天天射| 国产香蕉一区二区三区在线视频| 免费观看久久久久| 国产亚洲综合久久| 黄色网址在线免费| 91av成人在线| 日韩黄色碟片| 国产午夜精品一区| 欧美色网址大全| 欧美极品色图| 天天影视天天精品| 99视频在线免费播放| 蜜臀久久久久久久| 亚洲男人天堂色| 国产一区二区日韩精品| 亚洲成人日韩在线| 97久久超碰精品国产| 美女av免费看| 亚洲va欧美va人人爽午夜| 自拍偷拍精品视频| 亚洲福利在线视频| 欧美成人hd| 秋霞av国产精品一区| 国语精品视频| 日韩在线电影一区| 大胆日韩av| 日日摸日日碰夜夜爽无码| 精品亚洲欧美一区| www.久久国产| 亚洲电影一区二区| 91精东传媒理伦片在线观看| 精品在线欧美视频| 欧美在线观看在线观看| 欧美高清激情视频| 日韩电影精品| 五月天婷亚洲天综合网鲁鲁鲁| 亚洲人妖在线| 国产99久久九九精品无码| 国产欧美综合一区二区三区| 女同激情久久av久久| 精品一区二区三区在线观看国产| 亚欧激情乱码久久久久久久久| www.日本不卡| 麻豆av免费观看| 一区二区三区 在线观看视频| 亚洲天堂网在线视频| 亚洲男人天堂久| av成人影院在线| 99三级在线| 欧美另类综合| 亚洲国产午夜精品| 成人av网站在线| 永久免费成人代码| 天天操天天干天天综合网| www日本视频| 日韩精品亚洲元码| av电影在线免费| 国产 高清 精品 在线 a| 色婷婷av一区二区三区丝袜美腿| 女女同性女同一区二区三区91| 精品国产一区二区三区香蕉沈先生| 草b视频在线观看| 懂色av一区二区三区免费看| 色婷婷在线视频观看| 欧美日韩国产高清一区二区三区| 国产黄色片在线播放| 超碰91人人草人人干| 欧美亚洲黄色| 一本色道久久综合亚洲精品婷婷 | 中文字幕 国产| 日韩欧美国产一二三区| 大片免费在线观看| 欧美亚洲另类在线| 日韩激情毛片| 人妻内射一区二区在线视频| 国产午夜精品一区二区三区嫩草| 成年人视频软件| 7777精品伊人久久久大香线蕉经典版下载| 99reav在线| 91视频国产高清| 国产精品地址| 免费看黄色aaaaaa 片| 色综合久久天天综合网| 成年人视频网站在线| 成人免费激情视频| 国产综合久久| 亚洲av无码一区二区二三区| 欧洲日韩一区二区三区| 蜜桃视频在线观看免费视频网站www| 亚洲精品日产aⅴ| 国内久久视频| 18禁裸乳无遮挡啪啪无码免费| 欧洲精品中文字幕| 成码无人av片在线观看网站| 国产精品美女诱惑| 夜间精品视频| 成人区人妻精品一区二| 色屁屁一区二区| 国产剧情在线| 国内精品视频在线播放| 日韩成人午夜精品| 激情小说欧美色图| 精品成人在线视频| 69久久久久| 国产欧美一区二区三区不卡高清| 午夜影院日韩| 强制高潮抽搐sm调教高h| 精品国产一区二区在线观看| 秋霞影院午夜丰满少妇在线视频| 97夜夜澡人人双人人人喊| 亚洲专区免费| 欧美第一页在线观看| 国产视频在线一区二区| 小说区图片区亚洲| 欧美啪啪免费视频| 亚洲欧洲精品一区二区三区不卡| 国产偷人爽久久久久久老妇app| 日韩视频精品在线| 日日天天久久| 特黄特色免费视频| 欧美无人高清视频在线观看| a国产在线视频| eeuss中文| 国产三级一区二区三区|