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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汉字乱码_彻底搞懂这烦人的编码与乱码!

發(fā)布時間:2024/9/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汉字乱码_彻底搞懂这烦人的编码与乱码! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?

我們平時在處理文本文件或者網(wǎng)絡請求時,時不時會遇到亂碼的情況,這篇文章就帶你徹底搞懂編碼和亂碼

?

首先,我們要知道,在計算機中,一切都是用0和1來表示的。普通的txt文件、或者客戶端發(fā)過來的數(shù)據(jù)等等,這些一切其實都是通過0和1轉化而來的。「那它是怎樣從0和1轉化我們?nèi)四芸炊淖帜富驖h字呢?」

ASCII

起初,計算機是由美國人發(fā)明的,而且那時候基本就在美國運行,因此,開始只考慮到了美國的需求,0和1只要能轉化成英文字母和符號就行了,大概需要128個字符,所以就規(guī)定了0和1轉化為這128個字符的規(guī)則,稱作「ASCII編碼」

計算機存儲的最小單位是byte,而1byte有8個bit位,足夠表示128個字符(「第一位用0表示,剩下7位從0-127分別表示128個字符」),因此ASCII編碼就規(guī)定1byte對應一個英文字符,對應關系如下圖:

雖然ASCII編碼對于美國來說足夠用了,但是其他國家顯然是不夠的,于是,各個國家就發(fā)明了自己的編碼方式,比如我們「中國的GBK和GB2312等」。但是各個國家自己的編碼也都會兼容ASCII編碼(畢竟人家是鼻祖),前面說到ASCII編碼的第一位為0,則其他國家自己的編碼都會定義第一位為1,這樣就能區(qū)分當前是ASCII編碼還是自己國家的編碼。

中國的編碼

對于美國而言,一個字節(jié)就能表示所有的字符,但是在中國就不行了,光常見的漢字就有好幾千個了,還不包括符號,因此,中國首先出現(xiàn)的編碼形式是「GB2312」,它使用兩個字節(jié)來表示,這種編碼主要表示的是簡體中文,不包括繁體字。

后來在GB2312的基礎上,又發(fā)明了「GBK」編碼(「GB2312表示的字符,用GBK顯示完全一樣」),增加了一萬多個漢字,里面包括繁體字,這就是我們?nèi)粘J褂米畛R姷膰鴥?nèi)編碼。此編碼也是使用兩個字節(jié)來表示。

在這里提一下,怎么看一個字符使用了幾個字節(jié),可以使用文本編輯器,我這里使用的是EmEditor,當然,其他的也行,如果是nodepad++則需要裝一個插件查看二進制。

打開EmEditor,雙擊右下角的編碼,選擇GB2312

接著輸入一個字符,然后再雙擊右下角的編碼,選擇二進制(十六進制)視圖。

可以看到,使用的是兩個字節(jié)。這里再提一點,「為啥查看二進制,很多編輯器默認都是顯示的是十六進制」?為啥不直接顯示二進制,這是因為,一個字節(jié)有8個bit位,而一個十六進制數(shù)字能表示4個bit位,所以一個字節(jié)剛好可以使用兩個十六進制來表示,就像上面顯示的“B9 FA",兩個表示一個字節(jié),既簡單又直觀,如果直接使用二進制,要顯示十六個0或1,眼都要看花掉。

因此,查看字符的二進制數(shù)據(jù),最好是通過十六進制來查看。

世界統(tǒng)一編碼

世界上有很多國家,每個國家都有自己特有的編碼方式,這就導致了編碼不統(tǒng)一,容易造成亂碼的情況。那有什么方式可以讓編碼統(tǒng)一起來呢?可以通過「Unicode」

Unicode和其他編碼方式不一樣,它沒有規(guī)定字符對應的二進制,也沒有規(guī)定每個字符占多少個字節(jié),「它只做了一件事,就是給世界上所有的字符分配了一個唯一的數(shù)字編號」,就像人的身份證一樣,這是唯一的,它的范圍從0x000000到0x10FFFF之間(十六進制以0x開頭,二進制以0b開頭,八進制以0開頭),這個編號一般寫成十六進制,前面再加上\u。例如”國“的Unicode就是”\u56fd“。

那這些編號怎么對應到二進制呢?可以采用UTF-8或者UTF-16和UTF-32等。我們平時使用的最多的就是「UTF-8」

UTF-8使用的字節(jié)跟Unicode編號的大小有關,編號越大,使用的字節(jié)越多,字節(jié)個數(shù)在1-4之間。對于大部分漢字而已,一個中文字符需要三個字節(jié)。而且UTF-8兼容ASCII。

亂碼

我們平時出現(xiàn)亂碼主要有三種情況。

「第一種」:用文本編輯器打開一個文本文件時,顯示亂碼。

這種情況是因為,我們平時有時候文本編輯器設置了固定UTF-8編碼,但是突然打開一個GBK編碼個文件,這時候就會出現(xiàn)亂碼,里面只有漢字會亂碼。

解決方法:只要將編輯器的編碼方式設置成對應的即可。

「第二種」:在程序中讀取文件,出現(xiàn)亂碼。

這種情況是因為,在程序中讀取文件一般都會設置編碼,有時候省略編碼就會讀取系統(tǒng)的默認編碼,如果設置的編碼和文件的編碼對應不上就會出現(xiàn)亂碼。

解決方法:讀取文件時設置的編碼和文件編碼保持一致。

「第三種」:接收請求數(shù)據(jù)出現(xiàn)亂碼。

網(wǎng)絡中傳輸?shù)臄?shù)據(jù)也都是二進制數(shù)據(jù),所以在我們傳輸數(shù)據(jù)的時候,發(fā)送方指定一種編碼將數(shù)據(jù)轉成二進制通過網(wǎng)絡傳輸?shù)浇邮辗?#xff0c;接收方再指定一種編碼將二進制數(shù)據(jù)轉成字符數(shù)據(jù)。如果發(fā)送方和接收方指定的編碼不一致,則會出現(xiàn)亂碼情況。

解決方法:發(fā)送方和接收方采用統(tǒng)一編碼即可,一般都是采用UTF-8。

?

注意:不論是字符串轉二進制,還是二進制轉字符串都需要指定編碼,例如Java中字符串的getBytes()方法將字符串轉成字節(jié)數(shù)組,雖然方法可以不傳編碼格式,但內(nèi)部會傳入系統(tǒng)默認編碼Charset.defaultCharset().name()。又比如String(byte bytes[], String charsetName)方法將字節(jié)數(shù)組轉成字符串,也依然需要傳入編碼格式,如果不傳就會采用系統(tǒng)默認編碼。

?
掃一掃,關注我

Java面試系列-線程相關(一)

2020-09-03

Java到底是引用傳遞還是值傳遞

2020-08-07

事務:不好意思,你被隔離了!

2020-07-23

spring事務咋和新冠病毒一樣,還會傳染?

2020-07-05

數(shù)據(jù)是怎么一步一步到服務器的

2020-06-18

總結

以上是生活随笔為你收集整理的汉字乱码_彻底搞懂这烦人的编码与乱码!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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