CMD中文乱码出现的原因及解决办法
出現情況
在用notepad++編寫helloword程序時,由于將感嘆號輸成中文的“!”而不是英文的"!",導致運行時出現亂碼,結果如下所示。
為什么會出現這個情況,發現在notepad++中選擇的字符編碼是utf-8。
將其改為ansi試試,亂碼的問題就會解決。
什么是字符編碼
那什么是字符編碼呢?我所理解的字符編碼就是“!”這個字符后面藏著它的utf8或者ansi編碼,查閱資料后才知道,當我們在一個文件中看到的字符串是系統把內存中的編碼信息讀取顯示出來,當保存文件時系統就會把這個文件以我們所設置的編碼方式編碼,再放入內存中。例如通信系統中的調制與解調一樣,GBK代表AM調制,而utf8代表著FM調制,如果我的發射端是將數據進行AM調幅,當接收端將數據進行FM解調,那解調出的數據肯定會有問題。
因此在cmd控制臺出現亂碼的原因有一點清晰了,就是我在notepad++中保存的“!”的編碼與cmd控制臺中需要輸出的"!"編碼法不一致,導致輸出了cmd中默認的編碼方式所對應的的漢字“錛”,導致了亂碼。因此,先要了解什么是ANSI編碼,什么是UTF8編碼,什么是GBK編碼。
ANSI編碼
ANSI是一種字符代碼,為使計算機支持更多語言,通常使用 0x00~{} 0x7f 范圍的1 個字節來表示 1 個英文字符。超出此范圍的使用0x80~{} 0xFFFF來編碼,即擴展的ASCII編碼。ANSI并不是某一種特定的字符編碼,而是在不同的系統中,ANSI表示不同的編碼。美國人使用的系統中ANSI編碼其實是ASCII編碼(ASCII編碼不能表示漢字,所以漢字為亂碼),而我的系統中(“漢字”正常顯示)ANSI編碼其實是GBK編碼。
ASCII碼
ASCII碼是7位編碼,編碼范圍是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯數字和標點符號等字符。其中0x00-0x20和0x7F共33個控制字符。 只支持ASCII碼的系統會忽略每個字節的最高位,只認為低7位是有效位。
當時的美國人認為這幾位足夠表示英文字母了,但是表示中文字符則遠遠不夠,所以有了下一節提到的GBK編碼。
GBK編碼
GBK編碼是國家制定的一個專門用于編碼漢字的一套編碼方式。GBK編碼采用單雙字節變長編碼,英文使用單字節編碼,完全兼容ASCII字符編碼,中文部分采用雙字節編碼。雙字節其編碼范圍從8140至FEFE。
單字節:00000000 - 01111111
雙字節:10000001 01000000 - 11111110 11111110
單字節、雙字節的區分通過高字節高位區分,單字節高位為0,雙字節的高字節高位為1。需要注意的是,GBK編碼方式一個漢字是兩個字節。
UTF-8編碼
UTF-8是一種針對Unicode的一種可變長度字符編碼。它可以用來表示Unicode標準中的任何字符。對于某一個字符的UTF-8編碼,如果只有一個字節則其最高二進制位為0;如果是多字節,其第一個字節從最高位開始,連續的二進制位值為1的個數決定了其編碼的位數,其余各字節均以10開頭。UTF-8最多可用到6個字節。 需要注意的是,UTF-8編碼方式一個漢字占3個字節。
如表:
1字節 0xxxxxxx
2字節 110xxxxx 10xxxxxx
3字節 1110xxxx 10xxxxxx 10xxxxxx
4字節 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字節 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字節 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
查看亂碼出現的原因
說了這么多,試著看看在UTF8編碼下的“!”和GBK編碼下的“錛”到底有什么關系。從網上下載一個HxD Hex Editor的軟件,這個軟件可以把txt文本中的漢字轉換成16進制編碼。在notepad下以UTF8的編碼方式寫入“!”,命名為utf8.txt。
新建一個文本設置其編碼方式為GBK,輸入字符“錛”,命名為gbk.txt。
我們打開HxD Hex.exe軟件,把utf8.txt和gbk.txt導入到軟件中,查看相應符號的編碼。utf8.txt的編碼如下圖所示,從圖中可以看出“!”所對應的十六進制編碼為EF BB BF EF BC 81。
gbk.txt的編碼如下圖所示,從圖中可以看出“錛”所對應的十六進制編碼為EF BC。
把它們兩轉為二進制的編碼對比看看。
gbk :1110 1111 1011 1100
utf8:1110 1111 1011 1011 1011 1111 1110 1111 1011 1100 1000 0001
GBK顯示漢字時只顯示2位字節也就是16位二進制數,而且為了標記UTF-8的中文字符,通常會在前面加上EF BF EF的標簽,因此在cmd中以GBK方式顯示時,去除了UTF-8的標簽EF BF EF,就只剩下EF BC 81了,又因為GBK顯示一個中文字符需要兩個字節的長度,所以就只截取了EF BC兩位,而EF BC在GBK中所對應的漢字就是“錛”,為什么會出現亂碼的原因應該說明白了。
如何解決亂碼
如何解決在cmd當中輸入中文亂碼的問題,知道其亂碼原因之后我們就可以更好的解決這個問題。
方法一:把文本編輯的編碼改為ANSI,這樣就與cmd的GBK編碼對應,顯示中文時候就不會出現亂碼。但這個方法指標不治本,無法從根本上解決這個問題。
方法二:將cmd的編碼類型改為UTF-8,同時notepad++的編寫也為UTF-8。這樣做的原因是UTF-8可以支持在世界上任何國家任何瀏覽器支持任何文字,只要對方的編碼也是UTF-8,不管他是美國人還是法國人還是印度人,都可以正常的瀏覽中文。設置方法如下:
打開cmd,輸入chcp,就可以查看當前cmd使用的字符編碼是什么,936代表著GBK編碼。
在cmd中輸入chcp 65001,把cmd的字符編碼臨時改為utf-8編碼。
但這樣的更改只是一次性的,要想永久更改,需要點擊菜單欄右鍵開“屬性”>>“選項”,勾選“丟棄舊的副本”這一項。只有選中了這一項,才能在下一次打開cmd時,保持編碼方式為utf-8(65001)。
此時我們重新打開cmd,輸入chcp查看目前的編碼方式,可以看到此時的編碼方式為utf-8(65001)。如果不行就重啟一下。
再重新運行一下hello.c看看會不會有亂碼,運行結果如下所示。
可以看到中文的“!”可以顯示出來了,亂碼的問題成功解決!
總結
以上是生活随笔為你收集整理的CMD中文乱码出现的原因及解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言进行数据指定步长的区间统计
- 下一篇: C语言进行离散傅里叶DFT变换~MATL