UTF-8 8-bit Unicode Transformation Format 萬國碼

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,又稱萬國碼,由Ken Thompson於1992年創建。現在已經標準化爲RFC 3629。UTF-8用1到6個字節編碼Unicode字符。用在網頁上可以統一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。

發展歷程

編輯
在所有字符集中,最知名的可能要數被稱爲ASCII的7位字符集了。它是美國標準信息交換代碼(American Standard Code for Information Interchange)的縮寫, 爲美國英語通信所設計。它由128個字符組成,包括大小寫字母、數字0-9、標點符號、非打印字符(換行符、製表符等4個)以及控制字符(退格、響鈴等)組成。
但是,由於他是針對英語設計的,當處理帶有音調標號(形如漢語的拼音)的亞洲文字時就會出現問題。因此,創建出了一些包括255個字符的由ASCII擴展的字符集。其中有一種通常被稱爲IBM字符集,它把值爲128-255之間的字符用於畫圖和畫線,以及一些特殊的歐洲字符。另一種8位字符集是ISO 8859-1Latin 1,也簡稱爲ISOLatin-1。它把位於128-255之間的字符用於拉丁字母表中特殊語言字符的編碼,也因此而得名。歐洲語言不是地球上的唯一語言,因此亞洲和非洲語言並不能被8位字符集所支持。僅漢語字母表(或pictograms)就有80000以上個字符。但是把漢語、日語和越南語的一些相似的字符結合起來,在不同的語言裏,使不同的字符代表不同的字,這樣只用2個字節就可以編碼地球上幾乎所有地區的文字。因此,創建了UNICODE編碼。它通過增加一個高字節對ISO Latin-1字符集進行擴展,當這些高字節位爲0時,低字節就是ISO Latin-1字符。UNICODE支持歐洲、非洲、中東、亞洲(包括統一標準的東亞象形漢字和韓國表音文字)。但是,UNICODE並沒有提供對諸如Braille,Cherokee, Ethiopic, Khmer, Mongolian, Hmong, Tai Lu, Tai Mau文字的支持。同時它也不支持如Ahom, Akkadian, Aramaic, Babylonian Cuneiform, Balti, Brahmi, Etruscan, Hittite, Javanese, Numidian, Old Persian Cuneiform, Syrian之類的古老文字。
事實證明,對可以用ASCII表示的字符使用UNICODE並不高效,因爲UNICODE比ASCII佔用大一倍的空間,而對ASCII來說高字節的0對他毫無用處。爲了解決這個問題,就出現了一些中間格式的字符集,他們被稱爲通用轉換格式,即UTF(Unicode Transformation Format)。常見的UTF格式有:UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32

UTF-8字符集

編輯
如果UNICODE字符由2個字節表示,則編碼成UTF-8很可能需要3個字節。而如果UNICODE字符由4個字節表示,則編碼成UTF-8可能需要6個字節。用4個或6個字節去編碼一個UNICODE字符可能太多了,但很少會遇到那樣的UNICODE字符。
UTF-8編碼規則:如果只有一個字節則其最高二進制位爲0;如果是多字節,其第一個字節從最高位開始,連續的二進制位值爲1的個數決定了其編碼的字節數,其餘各字節均以10開頭。UTF-8轉換表表示如下:
Unicode/UCS-4
bit數
UTF-8
byte數
備註
0000 ~
007F
0~7
0XXX XXXX
1
 
0080 ~
07FF
8~11
110X XXXX
10XX XXXX
2
 
0800 ~
FFFF
12~16
1110XXXX
10XX XXXX
10XX XXXX
3
基本定義範圍:0~FFFF
1 0000 ~
1F FFFF
17~21
1111 0XXX
10XX XXXX
10XX XXXX
10XX XXXX
4
Unicode6.1定義範圍:0~10 FFFF
20 0000 ~
3FF FFFF
22~26
1111 10XX
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
5
說明:此非unicode編碼範圍,屬於UCS-4 編碼
早期的規範UTF-8可以到達6字節序列,可以覆蓋到31位元(通用字符集原來的極限)。儘管如此,2003年11月UTF-8 被 RFC 3629 重新規範,只能使用原來Unicode定義的區域, U+0000到U+10FFFF。根據規範,這些字節值將無法出現在合法 UTF-8序列中
400 0000 ~
7FFF FFFF
27~31
1111 110X
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
6
實際表示ASCII字符的UNICODE字符,將會編碼成1個字節,並且UTF-8表示與ASCII字符表示是一樣的。所有其他的UNICODE字符轉化成UTF-8將需要至少2個字節。每個字節由一個換碼序列開始。第一個字節由唯一的換碼序列,由n位連續的1加一位0組成, 首字節連續的1的個數表示字符編碼所需的字節數。
Unicode轉換爲UTF-8時,可以將Unicode二進制從低位往高位取出二進制數字,每次取6位,如上述的二進制就可以分別取出爲如下示例所示的格式,前面按格式填補,不足8位用0填補。
注:Unicode轉換爲UTF-8需要的字節數可以根據這個規則計算:如果Unicode小於0X80(Ascii字符),則轉換後爲1個字節。否則轉換後的字節數爲Unicode二進制位數減1再除以5。
示例
UNICODE uCA(1100 1010) 編碼成UTF-8將需要2個字節
uCA -> C3 8A, 過程如下:
uCA(1100 1010)處於0080 ~07FF之間,從上文中的轉換表可知對其編碼需要2bytes,即兩個字節,其對 應 UTF-8格式爲: 110X XXXX10XX XXXX。從此格式中可以看到,對其編碼還需要11位,而uCA(1100 1010)僅有8位,這時需要在其二進制數前補0湊成11位: 000 1100 1010, 依次填入110X XXXX 10XX XXXX的空位中, 即得 1100 0011 1000 1010(C38A)。
同理,UNICODE uF03F (1111 0000 0011 1111) 編碼成UTF-8將需要3個字節:
u F03F -> EF 80 BF,對應格式爲:1110XXXX10XX XXXX10XX XXXX,編碼還需要16位,將1111 0000 0011 1111(F03F)依次填入,可得 1110 1111 1000 0000 1011 1111(EF 80 BF)。
Unicode 16進制
Unicode 2進制
bit數
UTF-8 2進制
UTF-8 16進制
CA
1100 1010
8
1100 00111000 1010
C3 8A
F0 3F
11110000 0011 1111
16
111011111000 00001011 1111
EF 80 BF

UTF-8優缺點

編輯

UTF-8優點

UTF-8編碼可以通過屏蔽位和移位操作快速讀寫。字符串比較時strcmp()和wcscmp()的返回結果相同,因此使排序變得更加容易。字節FF和FE在UTF-8編碼中永遠不會出現,因此他們可以用來表明UTF-16或UTF-32文本(見BOM) UTF-8 是字節順序無關的。它的字節順序在所有系統中都是一樣的,因此它實際上並不需要BOM。

UTF-8缺點

你無法從UNICODE字符數判斷出UTF-8文本的字節數,因爲UTF-8是一種變長編碼它需要用2個字節編碼那些用擴展ASCII字符集只需1個字節的字符 ISO Latin-1 是UNICODE的子集,但不是UTF-8的子集 8位字符的UTF-8編碼會被email網關過濾,因爲internet信息最初設計爲7位ASCII碼。因此產生了UTF-7編碼。 UTF-8 在它的表示中使用值100xxxxx的機率超過50%, 而現存的實現如ISO 2022, 4873, 6429, 和8859系統,會把它錯認爲是C1 控制碼。因此產生了UTF-7.5編碼。

UTF-8修正更新

編輯
java使用UTF-16表示內部文本,並支持用於字符串行化的非標準的修正UTF-8編碼。
UTF-8保存使用UTF-8保存使用
標準UTF-8和修正的UTF-8有兩點不同:
修正的UTF-8中,null字符編碼成2個字節(1100000010000000)而不是標準的1個字節(00000000),這樣作可以保證編碼後的字符串中不會嵌入null字符。因此如果在類C語言中處理字符串,文本不會在第一個null字符時截斷(C字符串以'\0'結尾)。
在標準UTF-8編碼中,超出基本多語言範圍(BMP-Basic Multilingual Plane)的字符被編碼爲4字節格式,但是在修正的UTF-8編碼中,他們由代理編碼對(surrogatepairs)表示,然後這些代理編碼對在序列中分別重新編碼。結果標準UTF-8編碼中需要4個字節的字符,在修正後的UTF-8編碼中將需要6個字節。

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