Unicode了解⼀下:编码算法
# UTF-8
UTF-8是⼀种字符长度可变的Unicode编码⽅式。他可以编码Unicode中的所有码位,共
UTF-8的规则很简单:
存储长度:从最低1字节到最⾼4字节可变。但是被RFC3629规范之后,只能使⽤Unicode(U+0000 ~ U+10FFFF)定义的区域,现在UTF8的最⾼为4字节,但理论上可以⽀持到最⾼6字节的编码范围
单字节规则:最⾼位永远为0,完全和ASCII编码相同
多字节规则:的第⼀字节的⾼位决定了序列的长度,其他字节的⾼位固定为10开头
我们来看⼀下Unicode的编码规则:
优点
1. 对于ASCII编码的⽂件完全兼容,且只⽤单字节就可以存储。对于部分只⽤到ASCII字符来说,存储⾮常节省。
2. 保证⼀个字符的序列出错不会影响另⼀个字符的序列。⾮常适合⽹络传输
3. 因为以字节为编码单元,⽆需考虑字节顺序的问题。所以也不需要BOM
缺点
1. CJK⽂字分布在U+2E80以上,属于三字节的范畴。⽐起GB2313的双字节要多⼀半的存储空间
2. 因为是可变长度编码,⽆法实现的搜索和随机访问。
# UTF-16
UTF-16的长度为双字节或四字节的可变长度。双字节为Unicode的BMP平⾯,四字节通过High Surrogate和Low Surrogate组合。可以组合出Unicode的16个补充平⾯。字符覆盖Unicode所有码位,数量为
转换规则:
BMP平⾯中的码位
即⼩于 U+10000,数值直接等于码位的数值,并使⽤双字节
BMP平⾯下的转换过程
如 $U+0024
对应的⼆进制是 0000 0000 0010 0100
UTF16编码之后,和⼆进制完全相同。不需要做任何转换
最终得到的UTF16编码位 0024
辅助平⾯的码位
即⼤于等于 U+10000,使⽤代理对的模式进⾏编码
前16位使⽤ U+D800 ~ U+DBFF,后16位使⽤ 0xDC00 ~ 0xDFFF
辅助平⾯算法过程
如 U+2BB62
对应的⼆进制是 0010 1011 1011 0110 0010
unicode编码转换二进制0x2BB62 减去 0x10000 得到 0x1BB62 = 0001 0100 1011 0110 0010
前10位为 00 0101 0010 = 0x0082 加上 0xD800 得到 0xD882为⾼代理
后10位为 11 0110 0010 = 0x0362 加上 0xDC00 得到 0xDF62为低代理
得到UTF16编码为 D882 DF62
优点
1. 原本Unicode只有BMP平⾯的时候,UTF-16为固定长度存储。计算长度和索引⾮常⽅便。但是后来扩展Unicode之后,强⾏加⼊代
理对才能解决问题。导致这个优势不复存在。
2. 和UTF-8⼀样,因为双字符是成对的,⾼代理低代理或者低代理⾼代理。每个16位均有范围,所以另⼀个字符的⼀部分是这个字符的
⼀部分的可能性是0。部分出错可以⽴刻得知。⼀个字符出错不会影响后续字符。
缺点
1. 不兼容ASCII
2. 由于硬件和系统不同的关系,需要定义字节序
3. 最少需要使⽤2字节,最多需要4字节。相⽐UTF-8的存储⼤了很多。
# UTF-32
定长存储。每个字符都使⽤32位4字节进⾏存储。简单暴⼒。
优点
1. 定长存储,计算长度和索引超级快速。然⽽Unicode新标准的emoji中有ZWJ的存在。这个优势也会在以后逐渐消失了。
缺点
1. 存储空间太⼤。
# UCS-2
UCS-2是UTF-16的⼦集。他⽤16位对BMP平⾯的所有码位进⾏编码。缺点是因为定长多⼀个0x0,所以不兼容ASCII。
# UCS-4
UCS-4编码⽅式和UTF-32相同。原本UTF-32是USC-4的⼦集,但后来的各种修改后,现在USC-4和UTF-32相当于相同的编码⽅式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。