上面我们介绍了。。和西欧的文字和编码,但是也有很多来自世界其他国家的文字各个国家的电脑厂商对自己常用的字符进行编码,编码时基本忽略其他国家的字符和代码
甚至忽略了同一个国家的其他电脑厂商,结果就是代码太多,互不兼容世界上所有的字符可以统一编码吗?是的,这是UnicodeUnicode做了一件事,
就是给世界上所有的角色分配一个唯一的编号,范围从0x000000~0x10FFFF,包括110多万但大多数常用字符都在0x0000~0xFFFF之间,即65536个数字以内
每个字符都有一个Unicode数字,通常用十六进制表示,前面有一个U大多数。。数字的范围是从U4E00到U9FFF比如“马”的Unicode就是U 9A6C简单理解,
Unicode主要做一件事,就是给所有字符分配唯一的数值它没有指定这个数字如何对应于二进制表示,这与上面介绍的其他代码不同其他代码不仅指定可以表示哪些字符,
它还指定每个字符对应的二进制是什么,而Unicode本身只指定每个字符的编号那么数字如何对应二进制表示呢?有很多方案,主要是UTF-32,UTF-16和UTF-8
1.UTF-32最简单,是字符数的整数二进制形式,4个字节但是有一个细节,就是字节的顺序如果第一个字节是整数二进制中的最高位,而最后一个字节是整数二进制中的最低位,
那么这个字节顺序就叫“大端(BE)”,否则就叫“小端(le)”相应的编码方法分别是UTF-32BE和UTF-32LE正如可以看到的,
每个字符用4个字节表示,很浪费空间,实际用的更少2.UTF-16UTF-16用变长字节表示:1)对于编号从U0000到Uffff(通用字符集)的字符,直接用两个字节表示
需要注意的是,UD800 ~ UDBFF的编号实际上是未定义的2)字符值在U10000和U10FFFF之间的字符(也叫补充字符集)需要用4个字节表示前两个字节被称为高代理项,
范围是ud800 ~ udbff最后两个字节称为低代理,范围为udc00 ~ udfff数字编号和这种二进制表示之间有一个转换算法,本书不做介绍
区分两个字节还是四个字节。。一个字符取决于前两个字节的数字范围如果是Ud800 ~ UdbFF,就是四个字节,否则就是两个字节UTF-16和UTF-32有同样的字节顺序问题
如果高位存储在前面,称为大端(BE),编码称为UTF-16BE;否则就叫小端,编码叫UTF-16LEUTF-16常用于系统内部编码,比UTF-32节省大量空间
但是任何一个字符至少需要两个字节,这对于美国和西欧国家来说还是非常浪费的3.UTF-8UTF-8由可变长度字节表示每个字符使用的字节数与其Unicode数字的大小有关,小数字使用的字节数较少
数字越大,使用的字节越多,使用的字节数从1到4不等具体来说,对应于每个Unicode编码范围的二进制格式如表2-6所示
表2-6 UTF-8编码数范围及对应的二进制格式表2-6中的X表示可以使用的二进制位,每个字节开头的1或0是固定的小于128,编码同ASCII码,最高位为0
其他数字的第一个字节有特殊的含义最高位中几个连续的1表示几个字节,而所有其他字节都以10开始如何对Unicode数字进行编码?先把它当成整数,转换成二进制形式(去掉高阶0)
然后将二进制位从右到左依次填入对应的二进制格式X填充后,如果对应的二进制格式中还有一个未填充的X,则设置为0让我们看一个例子Ma的Unicode编码是0x9A6C,整数是39532
其对应的UTF-8二进制格式为:1110xxxxx
10。
标题:Unicode编码
链接:https://www.52hkw.com/news/rj/70627.html
版权:文章转载自网络,如有侵权,请联系删除!