Unicode UTF的不同

首先需要明白的是Unicode和UTF不是相同性質的概念。Unicode(Universal Multiple-Octet Coded Character Set)描述的是編碼的值,而UTF(UCS Transfer Format)描述的是對於這種編碼的值如何用字節表示來進行傳輸。

對於使用Unicode編碼,每一個符號的編碼值都是固定的,根據這個特定的編碼值就會顯示出該符號。但是Unicode沒有規定如何對這個編碼值進行解析。而UTF就是一種協議用來規定Unicode的編碼是如何進行轉換成字節來進行傳輸和解析的。

UTF-8是每次8個位傳輸數據,是在互聯網上使用最廣的一種unicode的實現方式,它的最大的一個特點是變長的編碼方式,它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。當字符在ASCII碼的範圍時,就用一個字節表示,保留了ASCII字符一個字節的編碼做爲它的一部分,注意的是unicode一箇中文字符佔2個字節,而UTF-8一箇中文字符佔3個字節)。從unicode到uft-8並不是直接的對應,而是要過一些算法和規則來轉換。

Unicode符號範圍 | UTF-8編碼方式

(十六進制)         |        (二進制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

計算機在需要顯示字符的時候,就會將UTF-8編碼的字節轉換成Unicode碼值,找到該碼值對應的字符進行顯示。

例如“漢”字的Unicode編碼是6C49。6C49在0800-FFFF之間,所以肯定要用3字節模板了:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001,用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

UTF-16是每次傳輸16個位數據。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼對應的16位無符號整數。對於不小於0x10000的UCS碼,定義了一個算法。不過由於實際使用的UCS2,或者UCS4的BMP必然小於0x10000,所以就目前而言,可以認爲UTF-16和UCS-2基本相同。但UCS-2只是一個編碼方案,UTF-16卻要用於實際的傳輸,所以就不得不考慮字節序的問題。


UCS有兩種格式:UCS-2和UCS-4。顧名思義,UCS-2就是用兩個字節編碼,UCS-4就是用4個字節(實際上只用了31位,最高位必須爲0)編碼。下面讓我們做一些簡單的數學遊戲:

UCS-2有2^16=65536個碼位,UCS-4有2^31=2147483648個碼位。

UCS-4根據最高位爲0的最高字節分成2^7=128個group。每個group再根據次高字節分爲256個plane。每個plane根據第3個字節分爲256行 (rows),每行包含256個cells。當然同一行的cells只是最後一個字節不同,其餘都相同。

group 0的plane 0被稱作Basic Multilingual Plane, 即BMP。或者說UCS-4中,高兩個字節爲0的碼位被稱作BMP。

將UCS-4的BMP去掉前面的兩個零字節就得到了UCS-2。在UCS-2的兩個字節前加上兩個零字節,就得到了UCS-4的BMP。而目前的UCS-4規範中還沒有任何字符被分配在BMP之外。


參考文章:ASCII、Unicode、GBK和UTF-8字符編碼的區別聯繫  
UNICODE,GBK,UTF-8區別

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