1. 程式人生 > >編碼及常見的編碼方式

編碼及常見的編碼方式

  以下內容為許令波先生所著《深入分析Java Web技術內幕》的學習及歸納總結。

1. 編碼

  編碼是資訊從一種形式或格式轉換為另一種形式的過程。在計算機裡,將我們人類所使用的語言轉化為計算機所使用的語言(二進位制)的過程,即為編碼。

  由於人類的語言太多,表示這些語言的符號太多,無法用計算機中一個基本的儲存單元——位元組(byte)來表示,因而必須要經過拆分或一些翻澤工作,才能讓計算機理解我們的語言。我們可以把計算機能夠理解的語言假定為英語,其他語言要能夠在計算機中使用,必須得經過一次翻譯,把它翻譯成英語。這個翻譯的過程就是編碼。

編碼的原因可以總結為以下2條:
I. 在計算機中儲存資訊的最小單元是1個位元組,即8個bit,所以能表示的字元範圍是0~255個。
II. 人類要表示的符號太多,無法用1個位元組來完全表示。要解決這個矛盾必須要有一個新的資料結構char,而從char到byte必須編碼。

2. 常見的編碼方式

  在計算機中提供了多種翻譯方式,常見的有ASCII,ISO-8859-1,GB2312,GBK,UTF-8,UTF-16等。它們都可以被看作字典,它們規定了轉化的規則,按照這個規則就可以讓計算機正確地表示我們的字元。
 

ASCII碼

  學過計算機的人都知道ASCII碼,總共有128個,用1個位元組的低7位表示,0~31是控制字元如換行、回車、刪除等,32 ~126是列印字元,可以通過鍵盤輸入並且能夠顯示出來。

ISO-8859-1

  128個字元顯然是不夠用的,於是ISO組織在ASCII碼基礎上又制定了一系列標準來擴充套件ASCII編碼,它們是ISO-8859-1至ISO-8859-15,其中ISO-8859-1涵蓋了大多數西歐語言字元,所以應用得最廣泛。ISO-8859-1仍然是單位元組編碼,它總共能表示256個字元。

GB2312

  GB2312的全稱是《資訊科技中文編碼字符集》,它是雙位元組編碼,總的編碼範圍是Al~F7,其中A1~A9是符號區,總共包含682個符號;B0~F7是漢字區,包含6763個漢字。

GBK

  GBK全稱是《漢字內碼擴充套件規範》,是國家技術監督局為Windows 95所制定的新的漢字內碼規範,它的出現是為了擴充套件GB2312,並加入更多的漢字。它的編碼範圍是8140~FEFE(去掉XX7F),總共有23 940個碼位,它能表示21 003個漢字,它的編碼是和GB2312相容的,也就是說用GB2312編碼的漢字可以用GBK來解碼,並且不會有亂碼。

G818030

  GB18030個稱是《資訊科技中文編碼字符集》,是我國的強制標準,它可能是單位元組、雙位元組或者四位元組編碼,它的編碼與GB2312編碼相容,雖然是國家標準,但是在實際應用系統中使用得並不廣泛。

UTF一16

  說到UTF必須提到Unicode ( Universal Code統一碼),ISO試圖建立一個全新的超語言字典,世界上所有的語言都可以通過這個字典來相互翻譯。可想而知這個字典是多麼複雜。關於Unicode的詳細規範可以參考相應文件。Unicode是Java和XML的基礎,下面詳細介紹Unicode在計算機中的儲存形式。

  UTF-16具體定義了Unicode字元在計算機中的存取方法。UTF-16用兩個位元組來表示Unicode的轉化格式,它採用定長的表示方法,即不論什麼字元都可以用兩個位元組表示。
  兩個位元組是16個bit,所以叫UTF-16。UTF-16表示字元非常方便,每兩個位元組表示一個字元,這就大大簡化了字串操作,這也是Java以UTF-16作為記憶體的字元儲存格式的一個很重要的原因。

UTF-8

  UTF-16統一採用兩個位元組來表示一個字元,雖然在表示上非常簡單、方便,但是也有其缺點,有很大一部分字元用一個字元就可以表示的現在要用兩個位元組表示,儲存空間放大了一倍,在現在的網路頻寬還非常有限的情況下,這樣會增大網路傳輸的流量,而且也沒有必要。而UTF-8採用了一種變長技術,每個編碼區域有不同的字碼長度。不同型別的字元可以由1~6個位元組組成。

UTF-8有以下編碼規則:
1.如果是1個位元組,最高位(第8位)為0,則表示這是1個ASCII字元(00~7F)。可見,所有ASCII編碼己經是UTF-8了。
2.如果是1個位元組,以11開頭,則連續的1的個數暗示這個字元的位元組數,例如:110xxxxx代表它是雙位元組UTF-8字元的首位元組。
3.如果是1個位元組,以10開始,表示它不是首位元組,則需要向前查詢才能得到當前字元的首位元組。