中文化和国际化问题权威解析之一:字符编码发展历程
?
单字节编码的发展在80年代早期,一些现在流行的标准(如ISO 8859和Unicode)还未出现。那时为了支持多种地区的语言,各大组织机构或IT厂商开始发明它们自己的编码方案,以便弥补ASCII编码的不足。一时间,各种互不相容的字符编码方案成百花齐放之势。
为了避免混乱,ISO组织在1998年之后,陆续发表了一系列代号为8859的标准,作为ASCII编码的标准扩展,终于统一了单字节的西方字符的编码。ISO是设在瑞士的国际标准化组织的简称(International Organization for Standardization)。
?
?
在UCS中,目前只有00组是重要的,Unicode学术学会断言,在可以预见的将来,甚至不可能用完00组中的前17个平面(00平面到10平面)。因此,Unicode只定义了ISO 10646的第00组的前17个平面。事实上,目前绝大多数字符,都分配在第00平面BMP中。
?
下表中列出了BMP中的字符分配情况:
?
UTF-8字节组合(二进制)0000 0000 —— 0000 007F
0xxxxxxx
0000 0080 —— 0000 07FF
110xxxxx 10xxxxxx
0000 0800 —— 0000 FFFF
1110xxxx 10xxxxxx 10xxxxxx
0001 0000 —— 001F FFFF
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000 —— 03FF FFFF
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000 —— 7FFF FFFF
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
在UTF-8内,
1. 如果一个字节,最高位(第8位)为0,表示这是一个ASCII字符(00 - 7F)。可见,所有ASCII编码已经是UTF-8了。
2. 如果一个字节,以11开头,连续的1的个数暗示这个字符的字节数,例如:110xxxxx代表它是双字节UTF-8字符的首字节。
3. 如果一个字节,以10开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节。
可见UTF-8可以有效地保证数据的完整性,避免出现编码的错位。即使偶然出现“坏字”,也不会影响到后续的文本。
那么UTF-8有什么缺点呢?显然,对于在BMP中的中文字来说,需要用3个字节才能表示,比使用UTF-16或直接使用双字节的GB2312编码大了0.5倍。
?
上文说了一大通,总结一下,其实很简单: