1. 程式人生 > >ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 編碼方式比較分析

ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 編碼方式比較分析

實際上在日常工作開發中,中文亂碼是經常出現的一類問題。下面介紹一下ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16、UTF-32編碼的原理以及不同點和區別。

ASCII

ASCII的英文翻譯是:American Standard Code for Information Interchange,也就是說,ASC後的II實際上是兩個首字母I的縮寫,而不是羅馬數字中的2。ASCII是最早最通用的單位元組編碼系統,因為發明時間早,所以ASCII編碼表的設計較為簡單。

結構

  1. ASCII表是單位元組字元表,此表中一個(英文)字元用一個位元組表示。
  2. 在ASCII中從00000000(第0個)~00011111(第31個)前32被用來作為控制字元表示各種類似:響鈴、退格、換頁等控制操作。
  3. 在ASCII中從00101111(第32個)~01111111(第127個)表示基本符號(!,@。%…)、數字(1,2,3…)、英文字母。
  4. ASCII表中一共有127個字元,後面的剩餘空閒的位元組沒有被使用。

GB2312

GB2312是1981年開始實施的一套漢字處理的編碼方案,GB是“基本”的意思,GB2312是對ASCII進行了擴充套件,在原來ASCII的基礎上擴充了6000多個漢字和600多個其他字元,是我們使用的較早的一個漢字編碼版本。

結構

  1. GB2312用一個位元組表示一個英文字元和一些基本符號和半形符號,用兩個位元組表示一個漢字和全形符號和一些我們日常使用的符號。
  2. GB2312利用了ASCII的127個字元之後空餘的部分,增添了6000多種常用漢字。
  3. 數值小於127的位元組表示ASCII中原有字元,兩個連續數值都大於127的位元組表示一個漢字字元。
  4. 使用GB2312編碼,當讀取到一個數值上小於127的位元組時當作一個ASCII中原有的字元處理。讀到一個數值大於127的位元組時會繼續讀取下一個位元組,下一個位元組的數值也必定是大於127,將兩個大於127的位元組一起組合形成一個字元。

GBK

GB2312有侷限性,只能表示6000個字元,GBK是對GB2312的升級,GBK與GB2312非常相似,唯一的不同:

結構

  1. 使用GBK編碼,當讀取到一個數值上小於127的位元組時當作一個ASCII中原有的字元處理。讀到一個數值大於127的位元組時必定會繼續讀取下一個位元組,下一個位元組的數值無需大於127
    ,將兩個位元組一起組合形成一個漢字字元。

僅僅是一點微小的變化,讓GBK在2312的基礎上多增加了20000餘個字元,GBK也是我們最常用的中文編碼表。相比較UTF-8,GBK需要的空間小,如果我們工作的受眾物件是漢語物件,使用GBK沒有問題,但需注意java語言使用unicode編碼,有可能會存在轉換問題導致亂碼,使用需謹慎。

Unicode

我們的GB2312和GBK都是在ASCII的基礎上修改而來,利用了ASCII只使用127個位元組的特點,而全世界其他的國家也是如此操作,導致了各個國家之間存在複雜的編碼轉換問題。而unicode的出現直接一次性掃清了所有障礙,原因很簡單:unicode編碼表中包含了世界上所有國家的所有字元和符號的編碼。  unicode這種稱呼是不專業的,這種統一世界的編碼方式叫做:Universal Multiple-Octet Coded Character Set,簡稱:UCS。我們在習慣上將它叫做unicode。unicode編碼是一種概念,在最新的規範中,所有的字元一概使用四個位元組表示,網上有很多說unicode用兩個位元組表示一個字元是不對的,Unicode字元分為17組編排,0x0000 至 0xFFFF,而每平面擁有65536個碼位,共1114112個。

UTF-8

unicode編碼是一種概念,實際上真正實現了unicode編碼的是被使用次數最多的UTF標準(UCS Transfer Format)。在UTF標準中現今最常用的是UTF-8。UTF-8是unicode編碼的一種實現

結構

  1. UTF-8靈活性很強,用1~4個位元組表示一個字元。
  2. 當字元在ASCII中可以被表示時,UTF-8編碼方式就用一個位元組來表示它。
  3. 在UTF-8中漢字用3個字元來表示。
  4. unicode中所有的字元一概使用兩個位元組表示。從unicode到UTF-8並不是直接的對應,而是要過一些演算法和規則來轉換。

UTF-16

UTF-16不是簡單的把UTF-8的範圍擴大了一倍,UTF-16和UTF-8是徹底不同的兩種編碼概念

結構

  1. 在絕大多數情況下,UTF-16中一個字元固定使用兩個位元組編碼,一個字元兩個位元組是UTF-16編碼的概念。
  2. 在極少數情況下也會出現三個位元組表示一個字元的情況。
  3. 由於UTF-16固定使用兩個位元組表示一個字元,所以UTF-16不能與ASCII相容。
  4. 在不同的機器中UTF-16存在因儲存方式不同(大端法和小端法)導致資料有誤,因此存在UTF16-LE和UTF16-BE兩種UTF16的變體。
  5. 相比較UTF-8,在儲存中文方面,UTF16更加結合空間。
  6. UTF-16容錯情況比UTF-8好,因為UTF-16穩定使用兩個位元組編碼,如果資料錯誤不會連代其他資料被讀錯,而UTF-8是變長編碼,可能導致後面的字元全部錯誤。
  7. UTF-16廣泛應用在各種系統中。

UTF-32

UTF-32可以說是“真正”的unicode編碼,unicode用四個位元組表示一個字元的特點在UTF-32中實現了,理論上這樣根本不需要複雜的分配位元組的方法,只需要每個字元一一對應即可,而且UTF-32的超大容量裝得下任何的字元。但是問題也就在這裡,一個字元需要四個位元組太過於奢侈,UTF-32並不是一個很常用的編碼方法。

轉載自地址,謝謝 https://blog.csdn.net/QuinnNorris/article/details/78705723