ASCII,UTF-8和Unicode字符編碼規範

ASCII

ASCII碼一共規定了128個字符的編碼,只佔用了一個字節的後面7位,最前面的1位統一規定爲0比如空格“SPACE”32(二進制00100000),大寫的字母A65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號)。

Unicode

正如上一節所說,世界上存在着多種編碼方式,同一個二進制數字可以被解釋成不同的符號。因此,要想打開一個文本文件,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。爲什麼電子郵件常常出現亂碼?就是因爲發信人和收信人使用的編碼方式不一樣。

可以想象,如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的編碼。

Unicode當然是一個很大的集合,現在的規模可以容納100多萬個符號。每個符號的編碼都不一樣,比如,U+0639表示阿拉伯字母AinU+0041表示英語的大寫字母AU+4E25表示漢字。具體的符號對應表,可以查詢unicode.org,或者專門的漢字對應表

Unicode的問題

需要注意的是,Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。

比如,漢字unicode是十六進制數4E25,轉換成二進制數足足有15位(100111000100101),也就是說這個符號的表示至少需要2個字節。表示其他更大的符號,可能需要3個字節或者4個字節,甚至更多。

這裏就有兩個嚴重的問題,第一個問題是,如何才能區別unicodeascii?計算機怎麼知道三個字節表示一個符號,而不是分別表示三個符號呢?第二個問題是,我們已經知道,英文字母只用一個字節表示就夠了,如果unicode統一規定,每個符號用三個或四個字節表示,那麼每個英文字母前都必然有二到三個字節是0,這對於存儲來說是極大的浪費,文本文件的大小會因此大出二三倍,這是無法接受的。

它們造成的結果是:1)出現了unicode的多種存儲方式,也就是說有許多種不同的二進制格式,可以用來表示unicode2unicode在很長一段時間內無法推廣,直到互聯網的出現。

UTF-8

UTF-8是Unicode的一種實現方式,也就是它的字節結構有特殊要求,所以我們說一個漢字的範圍是0X4E00到0x9FA5,是指unicode值,至於放在utf-8的編碼裏去就是由三個字節來組織,所以可以看出unicode是給出一個字符的範圍,定義了這個字是碼值是多少,至於具體的實現方式可以有多種多樣來實現。

UTF-8是一種變長字節編碼方式。對於某一個字符的UTF-8編碼,如果只有一個字節則其最高二進制位爲0;如果是多字節,其第一個字節從最高位開始,連續的二進制位值爲1的個數決定了其編碼的字節數,其餘各字節均以10開頭。UTF-8最多可用到6個字節。 
如表: 
1字節 0xxxxxxx 
2字節 110xxxxx 10xxxxxx 
3字節 1110xxxx 10xxxxxx 10xxxxxx 
4字節 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
5字節 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
6字節 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
因此UTF-8中可以用來表示字符編碼的實際數據位數最多有31位(6個字節時),即上表中x所表示的位。除去那些控制位(每字節開頭的10等),這些x表示的位與UNICODE編碼是一一對應的,位高低順序也相同。 
UNICODE轉UTF-8:實際將UNICODE轉換爲UTF-8編碼時應先去除高位0,然後根據所剩編碼的位數決定所需最小的UTF-8編碼位數。

因此那些基本ASCII字符集中的字符只需要一個字節的UTF-8編碼(7個數據位)便可以表示。 

而漢字的範圍是0X4E00到0x9FA5(即0100 1110 0000 0000到 1001 1111 1010 0101需15個數據位),需用三個字節表示。


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