utf16编码格式也有4字节的情况
UTF-16是Unicode字符集的⼀种转换⽅式,即把Unicode的码位转换为16⽐特长的码元串⾏,以⽤于数据存储或传递。UTF-16编码规则如下:
2.2.1 从U+D800到U+DFFF的码位(代理区)
因为Unicode字符集的编码值范围为0-0x10FFFF,⽽⼤于等于0x10000的辅助平⾯区的编码值⽆法⽤2个字节来表⽰,所以Unicode标准规定:基本多语⾔平⾯内,U+D800..U+DFFF的值不对应于任何字符,为代理区。因此,UTF-16利⽤保留下来的0xD800-0xDFFF区段的码位来对辅助平⾯的字符的码位进⾏编码。
但是在使⽤UCS-2的时代,U+D800..U+DFFF内的值被占⽤,⽤于某些字符的映射。但只要不构成代理对,许多UTF-16编码解码还是能把这些不符合Unicode标准的字符映射正确的辨识、转换成合规的码元. 按照Unicode标准,这种码元串⾏本来应算作编码错误.
2.2.2 从U+0000⾄U+D7FF以及从U+E000⾄U+FFFF的码位
第⼀个Unicode平⾯(BMP),码位从U+0000⾄U+FFFF(除去代理区),包含了最常⽤的字符。UTF-16与UCS-2编码在这个范围内的码位为单个16⽐特长的码元,数值等价于对应的码位。BMP中的这些码位
是仅有的码位可以在UCS-2被表⽰。
2.2.3 从U+10000到U+10FFFF的码位
辅助平⾯(Supplementary Planes)中的码位,⼤于等于0x10000,在UTF-16中被编码为⼀对16⽐特长的码元(即32bit,4Bytes),称作code units called a 代理对(surrogate pair),具体⽅法是:
Ø 码位减去0x10000, 得到的值的范围为20⽐特长的0..0xFFFFF(因为Unicode的最⼤码位是0x10ffff,减去0x10000后,得到的最⼤值是
0xfffff,所以肯定可以⽤20个⼆进制位表⽰),写成⼆进制形式:yyyy yyyy yyxx xxxx xxxx。
Ø ⾼位的10⽐特的值(值的范围为0..0x3FF)被加上0xD800得到第⼀个码元或称作⾼位代理(high surrogate), 值的范围是
0xD800..0xDBFF。由于⾼位代理⽐低位代理的值要⼩,所以为了避免混淆使⽤,Unicode标准现在称⾼位代理为前导代理(lead surrogates)。
Ø 低位的10⽐特的值(值的范围也是0..0x3FF)被加上0xDC00得到第⼆个码元或称作低位代理(low surrogate), 现在值的范围是
0xDC00..0xDFFF。由于低位代理⽐⾼位代理的值要⼤,所以为了避免混淆使⽤,Unicode标准现在称低位代理为后尾代理(trail surrogates)。
Ø 最终的UTF-16(4字节)的编码(⼆进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第⼀个WORD的⾼6位是110110,第⼆个WORD的⾼6位是110111。可见,第⼀个WORD的取值范围(⼆进制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第⼆个WORD 的取值范围(⼆进制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。上⾯所说的从U+D800到U+DFFF的码位(代理区),就是为了将⼀个WORD(2字节)的UTF-16编码与两个WORD的UTF-16编码区分开来。unicode编码转换二进制
由于⾼位代理、低位代理、BMP中的有效字符的码位,三者互不重叠,搜索是简单的: ⼀个字符编码的⼀部分不可能与另⼀个字符编码的不同部分相重叠。这意味着UTF-16是⾃同步(self-synchronizing):可以通过仅检查⼀个码元就可以判定给定字符的下⼀个字符的起始码元。 UTF-8也有类似优点,但许多早期的编码模式就不是这样,必须从头开始分析⽂本才能确定不同字符的码元的边界。
由于最常有的字符都在基本多⽂种平⾯中,许多软件的处理代理对的部分往往得不到充分的测试。这导致了⼀些长期的bug与潜在安全漏洞,甚⾄在⼴为流⾏得到良好评价的应⽤软件

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