字符编码一:Unicode 与 UTF-8之间的关系

时间:2021-07-23 20:16:47

一、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。

三、参考资料

  1. Unicode编码
  2. Unicode(UTF-8, UTF-16)令人混淆的概念