我對於Unicode編碼的一些認識

參考:https://blog.csdn.net/kupepoem/article/details/105242842

     Unicode是計算機領域的一項行業標準,它對世界上絕大部分的文字的進行整理和統一編碼,Unicode的編碼空間可以劃分爲17個平面(plane),每個平面包含2的16次方(65536)個碼位。17個平面的碼位可表示爲從U+0000到U+10FFFF,共計1114112個碼位,第一個平面稱爲基本多語言平面(Basic Multilingual Plane, BMP),或稱第零平面(Plane 0)。其他平面稱爲輔助平面(Supplementary Planes)。基本多語言平面內,從U+D800到U+DFFF之間的碼位區段是永久保留不映射到Unicode字符,所以有效碼位爲1112064個。

       unicode只是編碼數字我們這裏討論基本多語言平面U+0000到U+FFFF(漢文,韓語,日語的象形文字佔用從0X3000到0X9FFF),基本平面的unicode數字基本2個字節空間的大小就可以表示了。

如何表示unicode以下是我思考的幾種方法:

1、ASCII表示法

  ASCII 只有127個字符,表示英文字母的大小寫、數字和一些符號,但由於其他語言用ASCII 編碼表示字節不夠,例如:常用中文需要兩個字節,且不能和ASCII衝突,中國定製了GB2312編碼格式,相同的,其他國家的語言也有屬於自己的編碼格式。ASCII碼可以表示unicode中0x00-0x7F(0x00 空字符+127個字符),但是對於其它字符如何表示ASCII是不夠的。

2、utf8表示

UTF-8是一種變長編碼,對於一個Unicode的字符被編碼成1至4個字節。Unicode編碼與UTF-8的編碼的對應關係:

Unicode編碼 UTF-8編碼(二進制)
U+0000 – U+007F 0xxxxxxx
U+0080 – U+07FF 110xxxxx 10xxxxxx
U+0800 – U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

一個字節的uft8表示的unicode 碼範圍爲(0 ~0x7F)

兩個字節長度的uft8 表示的unicode碼範圍爲(0x80 ~ 0x07FF)

三個字節長度的uft8 表示的unicode碼範圍爲(0x0800 ~ 0xFFFF)

四個字節長度的uft8 表示的unicode碼範圍爲( 0x10000 ~ 0x10FFFF)(基本平面需要四字節表示)

從上表中可以看出漢子需要3個字節表示(漢文,韓語,日語的象形文字佔用從0X3000到0X9FFF),utf-8的一字節表示其實就ASCii的表示這樣可以ASCII上下兼容。一字節表示0xxxxxxx、2字節表示110xxxxx 10xxxxxx和3字節表示1110xxxx 10xxxxxx 10xxxxxx表示可以很容易的區分,所以對於解析也是挺容易。

 

基本平面中文用三個字節編碼,舉例如下:

Unicode 字符 UTF-8編碼
U+0041 A 0x41
U+7834 0xE7 0xA0 0xB4
U+6653 0xE6 0x99 0x93

    utf-8兼容AScii碼,對於英文數字較多的文檔比較有優勢。

3、utf16表示

UTF-16也是一種變長編碼,對於一個Unicode字符被編碼成1至2個碼元,每個碼元爲16位。

基本多語言平面(碼位範圍U+0000-U+FFFF)

在基本多語言平面內的碼位UTF-16編碼使用1個碼元且其值與Unicode是相等的(不需要轉換)。舉例如下

Unicode 字符 UTF-16(碼元) UTF-16 LE(字節) UTF-16 BE(字節)
U+0041 A 0x0041 0x41 0x00 0x00 0x41
U+7834 0x7834 0x34 0x78 0x78 0x34
U+6653 0x6653 0x53 0x66 0x66 0x53

    utf-16表示對於英文字符比utf-8會多一個字節,對於英文比較多的文檔空間上不如utf-8,但對於中文比較多的文檔utf-16還是比較有優勢的

4、utf-32表示

UTF-32是一種定長編碼,使用1個32bit的碼元,其值與Unicode編碼值相等。舉例如下:

Unicode 字符 UTF-32(碼元) UTF-32 LE(字節) UTF-32 BE(字節)
U+0041 A 0x00000041 0x41 0x00 0x00 0x00 0x00 0x00 0x00 0x41
U+7834 0x00007834 0x34 0x78 0x00 0x00 0x00 0x00 0x78 0x34
U+6653 0x00006653 0x53 0x66 0x00 0x00 0x00 0x00 0x66 0x53
U+2A6A5 𪚥 0x0002A6A5 0xA5 0xA6 0x02 0x00 0x00 0x02 0xA6 0xA5

    utf-32目前工業上使用較少,因爲它的空間浪費實在太大,效率上也沒有優勢。

5、總結

    unicode就是給各個符號規定的一個數字,唯一標識符號。如何編碼這個數字有4種方法,當然ASCII碼方法就能表示其中的128數字。utf-8、utf-16和utf-32都能全部表示 unicode中的數字。這裏我重點講了下基本平面的表示,對於輔助平面的表示大家可以看看https://blog.csdn.net/kupepoem/article/details/105242842,以後有時間我也會再寫關於輔助平面的表示。

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