Unicode与ISO10646(上)
|
一、缘起 1960年代初期,美国国会图书馆(Library of Congress, LC)的 Henriette Avram等人开始研拟机读编目格式,同时James Agenboard 等人也制订了英文的字符集和交换码,以做为美国图书馆界书目交 换的共同标准。LC交换码随后发展成为美国的国家标准ASCII(American Standard Codefor Information Interchange),而且还进一步演 变成世界性的计算机字符编码标准ISO646(其全名为7-bit coded character set for information interchange)。时至今日,虽然 一个字节(byte)的长度已经从7个位(bit)增加为8个位, ASCII和ISO646 仍然是计算机与网络世界里要的奠基标准。
依ASCII和ISO646的规定,7个位所能提供的128个编码位置(编 码范围为0~127)被区分为两部分:94个图形字符码和34个控制字 元码。图形字符包括52个大小写英文字母10个阿拉伯数字9个标 点符号6个括号,以及17个其它符号,编码范围从33到126。控制 字符则包括10个传输控制字符、6个版面调整字符、4个设备控制字 元、 4个信息分隔字符和10个特殊控制字符,其编码为0~32和127。 当计算机或网络设备收到一连串的位信号时,通常会一边接收一边 切分为字节(即每8个位一切),并且立刻分辨刚收到的位 组究竟是控制字符码还是图形字符码。若是属收讯设备相关的控制 字符时(例如传输控制、编码为7的BELL等字符),当计算机或网络 设备会截留该字符并立即做出对应动作(例如BELL字符会驱使收讯 设备叫一声),否则不予处理而传送给后续设备。换言之,计算机和 网络设备会吃掉位串里的特定控制字符码。
随着计算机功能的日趋强大与价格的日趋便宜,其应用领域也越来 越广。但是随之而来的各种编码需求,却使得单一字节的编码方 式,因编码空间太小,变得不足以因应各种应用程序的需求。中文 字、排版系统的标志符号、非英语拼音字母和图形符号等的编码, 需要使用2或多个字节来编码。同时,为了预防这些多字节字符 码被计算机或网络设备「吃掉」其中的某个字节,编码时必须避开 每个字节的0~32和127这34个句柄。这种做法严重浪费编码空 间,就多字节扩充编码的国际标准ISO2022而言,两个8位的位 元组只能提供最多188个控制字符和35,344个文字形符号的编码空间, 共计35,532个编码位置,但是16个位的编码空间事实上高达65,536。 两者相比较,ISO2022的16位编码只能达到最大编码空间的54%, 显得利用率很差。同时在应用层次的编码,由于厂商众多又缺乏共 识,往往你编你的码、我编我的码,其后果则是引发万码奔腾的乱 象。
为容纳全世界各种语言的字符和符号,ISO的一些会员国于1984年 发起制定新的国际字符集编码标准。新标准由工作小组ISO/IEC JTC1/SC2/WG2(注1)负责拟订(以下简称WG2),最后定案的标准 命名为“Universal Multiple-Octet Coded Character Set” (简称UCS),其编号则订为ISO/IEC 10646。依WG2原来的规划, ISO10646的编码结构系沿袭ISO2022八位延伸编码结构以避开C0和 C1两个句柄区(注2),但打破每个字符码里的所有字节的bit-8 (即最左边的位,其值为28=128)必须都设为0或是都设为1的限制, 以提高编码空间的使用率。同时,为了能有足够位置以容纳全世界各 种语言的字符和符号,以及为了配合微处理器以8、16、32甚或64个 位为一个运算处理单位的趋势,ISO10646的字符码长度被规定为 定长的4个八位(octet)。
ISO10646草案初稿一经公布,其编码结构立即遭到美国部份计算机 业者的反对。1988年初,美国Xerox公司的Joe Becker倡议以新的编 码结构,另外编订世界性字符编码标准:将计算机字符集编码的基本 单位由现行的7或8个位一举扩充为16个位,并且充分利用65,536 个编码位置以容纳全世界各种语言的字符和常用符号。新的字符集 编码标准被命名为“Unicode”(注3)。一群来自Xerox公司和Apple 公司的工程师组成工作小组,负责Unicode的原始设计工作。1991年 元月,十多家计算机硬软件、网络和信息服务业者,包括:IBM、DEC、 Sun、Xerox、Apple、MicroSoft、Novell名公司,共同出资成立 Unicode协会(The Unicode Consortium),并由协会设立非营利的 Unicode公司。Unicode协会成立之后,将原先的工作小组扩编为 Unicode技术委员会(Unicode Technical Committee),专责Unicode 的字符搜集、整理、编码等工作。推动Unicode成为国际标准的工作, 则由Unicode公司负责。Unicode草案第一版于1989年9月发表,历经 多次修订后,分别于1991、92年出版了Unicode标准第一版(The Unicode Standard, version 1.0)的第一、第二册。
由于Unicode协会持续的游说和施压,WG2终于放弃原先选择的ISO2022 八位延伸编码结构,改采Unicode的编码方式,亦即连续编码不再避开 C0和C1句柄区。1991年10月,历经几个月的协商之后,WG2和Unicode 协会达成协议,将Unicode并入ISO10646成为第0字面。之后各国语言字 元的搜集、整理和编码等工作转由WG2主导,而Unicode协会则积极协助 WG2,但双方仍然各自出版自己的编码标准。由于双方标准的整合是在 Unicode标准第一版第一册出版之后才展开的,因此该版次标准的第二 册特别在第一章里说明了为因应合并工作所做的编码区和字符集修订项 目。ISO于199月出版ISO10646-1(注4)的第一版,而第二版则经过多年 修订之后于今年3月出版。介于ISO10646-1第一、二版之间的Unicode标 准第二版于1996年出版,而对应于ISO10646-1第二版的Unicode标准第三 版于今年一月出版。今年三月,在北京举行的WG2第38次会议正式通过 ISO10646-2(注5)最终草案,预定五月底编辑完成后送交各会员国审 查,如无意外,明后年将会正式出版。
二、编码结构与字符集
ISO10646字符码的正规形式(可简称为UCS-4)为32个位,划分 成4个八位,如【图一】所示。这4个八位,由左而右命名为群 八位(G-octet)、面八位(P-octet)、列八位(R-octet) 和格八位(C-octet),分别代表编码结构中的群组(group)、 字面(plane)、列(row)与格(cell)。ISO10646规定其字符码 的b32必须为0,因而整个编码空间可区分为128个群组(群八位 的值为00~7Fh(注6)),每一群组由256个字面所组成(面八位 元为00~FFh),每一个字面由256列所组成(列八位为00~FFh), 每一列则包含256格(格八位为00~FFh),为一个编码位置。除 此之外,ISO10646还规定每一个字面的最后两个编码位置FFFEh和 FFFFh,保留不用。所以,ISO10646整个编码空间总共256×128= 32,768个字面,每个字面为256×256-2=65,534个编码位置,合 计65534×32768=2,147,418,112个编码位置。
ISO10646的第0群组第0字面(群八位和面八位的值都为00h) 称为「基本多语文字面」(Basic Multi-lingual Plane, BMP), 其编码字符与Unicode相同。BMP之外的32,767个字面区分为辅助字 面(supplementary planes)和专用字面(private use planes)。 辅助字面用以收容WG2陆续收集、整理和编码的各国语文字元;专 用字面的内容WG2不予规定,保留供使用者自行添加ISO10646未收 容的字符。专用字面共8,226个,包括00h群组的0Fh、10h和E0~ FFh共计34个字面,以及60~7Fh共32个群组的8,192个字面。除了 这8,226个专用字面之外,其余的24,541个字面都是辅助字面。 当计算机系统只使用BMP的字符码时,可以省略群八位和面八位 元,因而而将字符码由32个位缩短为16个位,称为ISO10646 字符码的基本面形式(可简称为UCS-2),其实也可视同于Unicode。
ISO10646所有字面中,目前仅有第0、第1和第2字面真正收容 编码字符。ISO10646的BMP和Unicode的编码字符,依其UCS-2编 码序介绍如下:
(1)0000~007Fh:基本拉丁字母区。其中0000~001Fh为C0控 制码,0020h为空格(space),0021~007Eh为ASCII图形 字符,007Fh为句柄DEL。事实上,这128个字符码只要 把前8个位去掉就可变成习见的8位形式的ASCII码。
(2)0080~00A0h:句柄区。其中0080~009Fh为C1句柄, 00A0h为不中断空格(no-break space)。
(3)00A1~1FFFh:拼音文字区。收容除基本拉丁字母以外的各种 拼音文字字符,包括欧洲各国语言、希腊文、斯拉夫语文、 源代码网供稿. |
