編碼

一, 常見碼錶:

ASCII:美國標準信息交換碼。		用一個字節的7位可以表示,最高位爲符號位。
ISO8859-1:拉丁碼錶。歐洲碼錶		用一個字節的8位表示。
GB2312:中國的中文編碼表。
GBK:中國的中文編碼表升級,融合了更多的中文文字符號。
GB18030:GBK的取代版本
BIG-5碼 :通行於臺灣、香港地區的一個繁體字編碼方案,俗稱“大五碼”。

二, 編碼衝突問題

全世界有上百種語言,日本把日文編到Shift_JIS 裏,韓國把韓文編到Euc-kr裏,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。
因此,Unicode應運而生。Unicode把所有語言都統一到一套編碼裏,這樣就不會再有亂碼問題了。

Unicode:國際標準碼,融合了多種文字。
         最常用的是用兩個字節表示一個字符(如果要用到非常偏僻的字符,就需要4個字節),
         Java語言使用的就是該編碼。

三, 傳輸以及存儲數據冗餘問題

如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不划算。本着節約的精神,又出現了把Unicode編碼轉化爲“可變長編碼”的UTF-8編碼

UTF-8: 稱爲通用轉換格式,即UTF(Universal Transformation Format)。
       目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, 以及 UTF-32。
       UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,
       常用的英文字母被編碼成1個字節,
       漢字通常是3個字節,
       只有很生僻的字符纔會被編碼成4-6個字節。

四, UTF-8和Unicode不存在隸屬關係, UTF-8不是Unicode的一部分,不是把高位爲零的截取掉那麼簡單

Unicode轉換到UTF-8規則如下:

(1)如果Unicode編碼的16位二進制數的前9位是0, 則UTF-8編碼用一個字節來表示,這個字節的首位是0,剩下的7位與原二進制數據的後7位相同。例如:

 Unicode編碼:\u0061 = 00000000 01100001
 UTF-8編碼: 01100001 = 0x61

(2)如果Unicode編碼的16位二進制數的頭5位是0,則UTF-8編碼用2個字節來表示,首字節用110開頭,後面的5位與原二進制數據去掉前5個零後的最高5位相同;第二個字節以10開頭,後面的6位與原二進制數據的低6位數據相同。例如:

Unicode編碼: \u00A9 = 00000000 10101001
UTF-8編碼: 11000010 10101001 = 0xC2  0xA9

(3)如果不符合上述兩個規則,則用3個字節表示。第一個字節以1110開頭,後四位爲原二進制數據的高四位,第二個字節以10開頭,後六位爲原二進制數據的中間6位,第三個字節以10開頭,後6位爲原二進制數據的低6位。例如:

Unicode編碼: \u4E2D = 01001110 00101101
UTF-8編碼: 11100100 10111000 10101101 = 0xE4 0xB8 0xAD

五, ASCII可以看做是UTF-8的一部分

英文的Unicode碼符合上面第四小節的第一條轉碼規則,使得英文情況下Unicode轉成utf-8,同時也轉成了ASCII表示方式.

六, 內存編碼, 存儲編碼, 傳輸編碼

在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換爲UTF-8編碼。

用記事本編輯的時候,從文件讀取的UTF-8字符被轉換爲Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換爲UTF-8保存到文件:
在這裏插入圖片描述
瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換爲UTF-8再傳輸到瀏覽器:
在這裏插入圖片描述
所以你看到很多網頁的源碼上會有類似的信息,表示該網頁正是用的UTF-8編碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章