utf 8與gbk的探析

2021-08-21 22:22:45 字數 1686 閱讀 4636

講述utf-8和gbk之前,首先需要講述的就是unicode,unicode又稱統一碼,屬於一種電腦科學領域的業界標準,是計算機處理字串的一種通用約定,用來滿足全球各種語言文字的轉換,處理,可以理解為囊括一切語言的計算機一切字元通用規則,unicode能夠相容地球上所有語言的編碼方式,給了每乙個字元乙個獨一無二的二進位制編碼,unicode大概可以容納一百多萬個字元(中文gbk一共也只有兩萬多的數量級)。

對於計算機而言,所有資料都是以二進位制儲存的,所以無論是何種語言,無論是英文,中文,法文,德文,日文,韓文,阿拉伯語,拉丁文,在計算機裡通通是二進位制以0和1來儲存的,在unicode誕生之前,一直以來用的都是ascii碼,ascii碼的規則很簡單,將單個字元以8位二進位制標識,因為英文只有26個大小寫字母和一些簡單的符號。

但是英文只有26個字母,不代表其他語言也只有26個,比如中文,拉丁文之類的語言,於是要在計算機上表現中文,就需要額外的機制來滿足這些字元的顯示,unicode顯示這些語言的原理就是用多位表示乙個字元,乙個字元對應唯一乙個二進位制數值,可以理解為乙個巨大的對映表。

但是unicode也是存在問題的,首先,它得相容ascii,如果給出三個位元組,unicode需要將之解析為三個ascii亦或是將之解析為乙個中文字呢?為了解決這樣的問題,unicode採用的是用三個到四個位元組去表示任何字元,原本ascii只有一位,在unicode中就被強制擴充為了三位,前面填0,這樣的編碼方式既相容了ascii,也滿足了唯一性,但是用unicode編碼的檔案,檔案大小有時候會增加三倍乃至四倍,其中很多位都是純0,浪費了大量控制項,這是無法接受的事情

於是就有了unicode的儲存實現方式,utf-8就是一種unicode的實現方式,即字元用一到四個位元組變長表示,其他的實現方式還包括utf-16(用2個或4個位元組),utf-32(用4個位元組),然而網際網路上幾乎不用這兩種

對於utf-8而言,它採用的方式是變長儲存,具體方案只有兩條:

1.對於英文,也就是可以用單位元組標識的字元,相容ascii,首位用0標識,後面跟7位ascii,等同於unicode碼

2.對於中文,也就是多位元組的字元,假設該字元的位元組數為n,則第乙個位元組的前n位都是1,n+1位為0(0utf-8相對於unicode的好處是節約了不少的空間,原本unicode儲存乙個ascii碼需要4個位元組,但是utf-8只需要乙個位元組

(ps:小端和大端的問題unicode採用的是在整個文字前多加兩個位元組,通過識別這兩個位元組來了解整個文字應該採用小端解碼還是大端解碼)

理解了utf-8,那麼理解gbk也就很簡單了

gbk是中國制定的針對中文的字元編碼機制,無論中文英文,一律採用雙位元組的形式表示,其中為了分辨中英文,中文的第一位固定為1,gbk包含了全部的中文,是國家編碼,但是通用性比utf-8差一點

那麼這個時候問題就來了,當不同語言用不同的編碼方式編碼檔案時,開啟乙個檔案就得首先知道其編碼格式,否則乙個檔案用a方式編碼,用b方式解碼,出來的必然是亂碼,比如用utf的方式去開啟gb系列編碼的檔案,原本的6個位元組應該表示三個字的,在utf開啟的時候就解析成了兩個字,於是就產生了亂碼,一些跨國郵件出現亂碼,就是因為傳送端的編碼方式和接收端的解碼方式不相同

將utf-8轉成gbk其實也不是很複雜的事情,原理就是,先將utf-8解析成為unicode(每個字元四個位元組的那種),然後再將unicode編碼成為gbk,gbk轉utf-8同理

gbk和utf-8各有各的適用場合,對於英文較多的檔案,採用utf-8更節約空間,因為utf-8的英文只需要乙個位元組,對於中文較多的檔案,用gbk更好

GBK與UTF 8的區別

gbk的文字編碼是雙位元組來表示的,即不論中 英文本元均使用雙位元組來表示,只不過為區分中文,將其最高位都定成1。至於utf 8編碼則是用以解決國際上字元的一種多位元組編碼,它對英文使用8位 即乙個位元組 中文使用24位 三個位元組 來編碼。對於英文本元較多的論壇則用utf 8節省空間。gbk包含全...

gbk與utf 8的區別

很多使用者問gbk與utf 8版本有什麼區別,這邊作了個整理如下 kesioncms的gbk版本與utf 8版本功能是一樣的 只不過編碼方式不同。gbk的文字編碼是雙位元組來表示的,即不論中 英文本元均使用雙位元組來表示,只不過為區分中文,將其最高位都定成1。至於utf 8編碼則是用以解決國際上字元...

GBK與UTF 8的區別

gbk的文字編碼是雙位元組來表示的,即不論中 英文本元均使用雙位元組來表示,只不過為區分中文,將其最高位都定成1。至於utf 8編碼則是用以解決國際上字元的一種多位元組編碼,它對英文使用8位 即乙個位元組 中文使用24位 三個位元組 來編碼。對於英文本元較多的論壇則用utf 8節省空間。gbk包含全...