參考: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,以後有時間我也會再寫關於輔助平面的表示。