我对于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,以后有时间我也会再写关于辅助平面的表示。

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