utf8、utf16、utf32之间的格式
这篇百度百科中讲解了utf8的格式、utf16的格式。
utf8的编码格式:
Unicode编码(⼗六进制) UTF-8 字节流(⼆进制)
000000-00007F0xxxxxxx
000080-0007FF110xxxxx 10xxxxxx
000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
010000-10FFFF
UTF-8的特点是对不同范围的字符使⽤不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与完全相同。UTF-8编码的最⼤长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位⼆进制数字。Unicode的最⼤码位0x10FFFF也只有21位。
例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使⽤3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成⼆进制是:0110 1100 0100 1001,⽤这个⽐特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使⽤4字节模板:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位⼆进制数字(不⾜21位就在前⾯补0):0 0010 0000 1100 0011 0000,⽤这个⽐特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。
utf16的编码格式:
D800-DB7F High Surrogates⾼位替代
DB80-DBFF High Private Use Surrogates⾼位专⽤替代
DC00-DFFF Low Surrogates低位替代
编码以16位⽆符号整数为单位。我们把Unicode编码记作U。编码规则如下
如果U<0x10000,U的UTF-16编码就是U对应的16位⽆符号整数(为书写简便,下⽂将16位⽆符号整数记作WORD)。
如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成⼆进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(⼆进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
为什么U'可以被写成20个⼆进制位?Unicode的最⼤码位是0x10FFFF,减去0x10000后,U'的最⼤值是0xFFFFF,所以肯定可以⽤20个位表⽰。例如:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成⼆进制是:0001 0000 1100 0011 0000。⽤前10位依次替代模板中的y,⽤后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。
按照上述规则,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。
数字转unicode编码关于这个之间的转换可以借鉴cjson源码中utf16转换为utf8。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论