一、Unicode编码
Unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案,又称统一码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990 年开始研发,1994 年正式公布。
Unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有 65536 个码位,共 65536*17=1114112 个,也就是说按照目前的编码方案,至少可以为 1114112 个字符进行二进制编码,目前只用了少数的平面。
通俗的将,Unicode相当于一部字典,为每一个字符定义了一个世界通用的二进制编码,比如我们中国的新华字典,定义了汉字的拼音编码。后面提到的UTF-8 是基于 Unicode 编码的一种计算机实现方式。
Unicode 17 个平面的编码范围如下表:
17组(平面) | 起始编码 | 终止编码 |
---|---|---|
0000 0000 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 0001 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 0010 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 0011 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 0100 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 0101 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 0110 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 0111 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 1000 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 1001 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 1010 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 1011 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 1100 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 1101 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 1110 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0000 1111 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
0001 0000 | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
二、UTF-8编码
UTF-8(8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度便于计算机处理和识别的字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到4个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。UTF-8、UTF-16、UTF-32都是将 Unicode 编码转换为便于计算机处理和识别的编码方案。
UTF-8 以字节为单位对 Unicode 进行编码。从 Unicode 到 UTF-8 的编码方式如下表所示:
Unicode编码(十六进制) | UTF-8 字节流(二进制) |
---|---|
00000000 - 0000007F | 0xxxxxxx |
00000080 - 000007FF | 110xxxxx 10xxxxxx |
00000800 - 0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
00010000 - 001FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
00200000 - 03FFFFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
04000000 - 7FFFFFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是6个字节。从上表可以看出,6字节模板有31个x,即可以容纳31位二进制数字。Unicode的最大码位0x7FFFFFFF也只有31位。
例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。