二分之一

Just Jason's Blog

谈谈字符集编码,详解utf-8、gb2312编码规则(二)

接上文:《谈谈字符集编码及gb2312、utf-8编码原理》

一、Unicode与UTF-8之间的的关系

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。 比如“二”字的unicode十六进制编码是:“4E8C”,对应二进制是:“100111010001100”共有15位,也就是说至少需要两个字节来存储;但对于unicode编码更大的字符,可能需要3个字节,甚至更多字节来存储。这样问题随之而来,在一段二进制流中如何区分这个字符是3个字节,还是6个字节呢?UTF-8就是unicdoe其中一个实现方式!注意只是其中一个,还有utf-16、utf-10等等…

二、UTF-8编码规则

使用1-4个字节来存储一个字符,最大的特点是可变长度。

编码规则:

如下表所示:字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
——————–+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx (可填11位unicode码)
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx (可填16位unicode码)
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (可填21位unicode码)

还以“二”(100111010001100)为例,依上表可知“二”在UTF-8编码中为三个字节使用格式1110xxxx 10xxxxxx 10xxxxxx,从最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了 11100100 10111010 10001100(红色加粗为补0)即十六进制为“E4BA8C”,这个编码即为“二”的UTF-8编码。

三、GB2312编码规则

GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。

每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。 “高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。

四、GB2312、UTF-8、UNICODE编码(内码或码字)在线查询

http://www.2fz1.com/so/ (本站原创工具,请勿非法访问)

最后修改时间:2014年9月9日星期二晚上7点09