计算机系统平台
上QQ阅读APP看书,第一时间看更新

3.2.3 Unicode字符集及其编码

当计算机广泛应用于世界各个国家和地区时,为了表达当地语言和字符,设计和实现类似GB 2312/GBK/GB 18030/BIG5的编码方案。这样各自设计一套编码规则,在本地使用没有问题,一旦出现在网络中,由于不兼容,互相访问就会出现乱码现象。

为了解决这个问题,产生了Unicode编码。Unicode编码系统为表达任意语言的任意字符而设计。它使用4字节的二进制数来表达每个字母、符号和表意文字(Ideograph)。每个数字代表唯一的至少在某种语言中使用的符号。被几种语言共用的字符通常使用相同的数字来编码,每个字符对应一个数字,每个数字对应一个字符,即不存在二义性。U+0041总是代表'A',即使这种语言没有'A'字符。

在计算机科学领域中,Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使计算机得以体现世界上数十种文字。Unicode是基于通用字符集(Universal Character Set)的标准发展的,并且同时也以书本的形式对外发布。Unicode还不断在扩增,每个新版本加入更多新的字符。截止目前的第六版,Unicode就已经包含了超过十万个字符(在2005年,Unicode的第十万个字符被采纳且认可成为标准之一)、一组可用以作为视觉参考的代码图表、一套编码方法与一组标准字符编码、一套包含了上标字、下标字等字符特性的枚举等。Unicode组织(The Unicode Consortium)是由一个非营利性的机构所运作,并主导Unicode的后续发展,其目标在于,将既有的字符编码方案以Unicode编码方案来取代,特别是既有的方案在多语种环境下仅有有限的空间以及不兼容的问题。

(1)UCS和Unicode

通用字符集( Universal Character Set, UCS)是由ISO制定的ISO10646(或称ISO/IEC10646)标准所定义的标准字符集。曾有两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。前者开发了ISO/IEC10646项目,后者开发了统一码项目。因此最初制定了不同的标准。

1991年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。于是,他们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode 2.0开始,Unicode采用了与ISO10646-1相同的字库和字码;ISO也承诺,ISO 10646将不会替超出U+10FFFF的UCS-4编码赋值,以使得两者保持一致。两个项目仍都存在,并独立地公布各自的标准。但统一码联盟和ISO/IECJTC1/SC2都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。

(2)UTF-32

上述使用4字节的数字来表达每个字母、符号或者表意文字(ideograph),每个数字代表唯一的至少在某种语言中使用的符号的编码方案,称为UTF-32。UTF-32又称UCS-4,是一种将Unicode字符编码的协定,对每个字符都使用4字节。就空间而言,是非常没有效率的。

这种方法有其优点,最重要的一点就是可以在常数时间内定位字符串里的第N个字符,因为第N个字符从第4×Nth个字节开始。虽然每一个码位使用固定长度的字节看似方便,但是它并不如其他Unicode编码使用得广泛。

(3)UTF-16

尽管Unicode字符非常多,但是实际上大多数人不会用到65535个以外的字符。因此,就有了另外一种Unicode编码方式,称为UTF-16(因为16位=2字节)。UTF-16将0~65535范围内的字符编码成2字节,如果真的需要表达那些很少使用的超过这65535范围的Unicode字符,则需要使用一些特殊的技巧来实现。UTF-16编码最明显的优点是它在空间效率上比UTF-32高两倍,因为每个字符只需要2字节存储(除去0~65535范围以外的),而不是UTF-32中的4字节。并且,如果我们假设某个字符串不包含任何非常用字符,那么依然可以在常数时间内找到其中的第N个字符,直到它不成立为止。其编码方法是:

①如果字符编码U小于0x10000,也就是十进制的0~65535范围内,则直接使用2字节表示。

②如果字符编码U大于0x10000,由于Unicode编码范围最大为0x10FFFF,从0x10000到0x10FFFF之间共有0xFFFFF个编码,也就是需要20位就可以表示这些编码。用U表示从0~0xFFFFF之间的值,将其前10位作为高位和16位的数值0xD800进行逻辑或操作,将后10位作为低位和0xDC00做逻辑或操作,这样组成的4字节就构成了U的编码。

(4)UTF-8

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码(定长码),也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只需做少部分修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中优先采用的编码。

UTF-8使用1~4字节为每个字符编码:

①128个US-ASCII字符只需1字节编码(Unicode范围由U+0000至U+007F)。

②带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母(马尔代夫文)则需要2字节编码(Unicode范围由U+0080至U+07FF)。

③其他基本多文种平面中的字符(这包含了大部分常用字)使用3字节编码。

④其他极少使用的Unicode辅助平面的字符使用4字节编码。