天天看點

Java編碼ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 編碼方式詳解1 ASCII2 GB23123 GBK4 Unicode5 UTF-86 UTF-167 UTF-32

1 ASCII

American Standard Code for Information Interchange。最早最通用的單位元組編碼系統,因為發明時間早,是以ASCII編碼表的設計較為簡單。

結構

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

2 GB2312

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

GB2312用一個位元組表示一個英文字元和一些基本符号和半角符号,用兩個位元組表示一個漢字和全角符号和一些我們日常使用的符号。

GB2312利用了ASCII的127個字元之後空餘的部分,增添了6000多種常用漢字。

數值小于127的位元組表示ASCII中原有字元,兩個連續數值都大于127的位元組表示一個漢字字元。

使用GB2312編碼,當讀取到一個數值上小于127的位元組時當作一個ASCII中原有的字元處理。讀到一個數值大于127的位元組時會繼續讀取下一個位元組,下一個位元組的數值也必定是大于127,将兩個大于127的位元組一起組合形成一個字元。

3 GBK

GB2312有局限性,隻能表示6000個字元,GBK是對GB2312的更新,GBK與GB2312非常相似,唯一的不同:

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

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

4 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個。

5 UTF-8

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

UTF-8靈活性很強,用1~4個位元組表示一個字元。

當字元在ASCII中可以被表示時,UTF-8編碼方式就用一個位元組來表示它。

在UTF-8中漢字用3個字元來表示。

unicode中所有的字元一概使用兩個位元組表示。從unicode到UTF-8并不是直接的對應,而是要過一些算法和規則來轉換。

6 UTF-16

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

在絕大多數情況下,UTF-16中一個字元固定使用兩個位元組編碼,一個字元兩個位元組是UTF-16編碼的概念。

在極少數情況下也會出現三個位元組表示一個字元的情況。

由于UTF-16固定使用兩個位元組表示一個字元,是以UTF-16不能與ASCII相容。

在不同的機器中UTF-16存在因存儲方式不同(大端法和小端法)導緻資料有誤,是以存在UTF16-LE和UTF16-BE兩種UTF16的變體。

相比較UTF-8,在存儲中文方面,UTF16更加結合空間。

UTF-16容錯情況比UTF-8好,因為UTF-16穩定使用兩個位元組編碼,如果資料錯誤不會連代其他資料被讀錯,而UTF-8是變長編碼,可能導緻後面的字元全部錯誤。

UTF-16廣泛應用在各種系統中。

7 UTF-32

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