在回答这个问题前,首先要清楚「Unicode」是什么(
What is Unicode?)。其次,要理解信息技术相关的国标中,几份编码字符集相关的标准,各自之间的引用、沿用关系,以及它们的源头。
- - -
GB 18030—2005《信息技术——中文编码字符集》,它的标题已经很明确地指出了这份标准的核心内容:编码字符集(coded character set)。
当然,延续了以往所有编码字符集相关的国标,它也伴随字符集给出了一种编码方案——这是一种单、双、四字节混合的编码方案(按照国标的术语,也就是为字符指派了「内码」)。
在 2005 年,GB 18030—2005 的字符集,实质上使用了 GB 13000 的字符集的一个子集(也可以说是在 GB 13000.1—1993 的基础上,扩增收入了一些新的字符);GB 13000.1—1993 是 1993 年 ISO/IEC 10646-1:1993 的等效标准;另外,2010 年修订(补完)的 GB 13000—2010 则是 ISO/IEC 10646:2003 的等效标准。而 ISO/IEC 10646 跟 Unicode 有一层很紧密的联系,但它们绝非等同,详情可参考 Unicode 官方的 FAQ(
FAQ - Unicode and ISO 10646)。
GB 18030 跟 Unicode 的关系纽带,实质上就存在于 ISO/IEC 10646 这份标准中。
- - -
问题说明里的追问,缺乏前提。GB 18030 本身就不是什么「自造的轮子」。
GB 18030—2005 文档中明确引用的国标有 5 份。其中 GB/T 2311—2000、GB/T 11393—1989 和 GB 13000.1—1993 都是对应 ISO/IEC 的等效标准;也就是说,国标明确声明了这些标准用了现成的轮子。并且,GB 13000 字符集的后续扩增及修订,依然在同步其等效对象 ISO/IEC 10646。
另外,GB 18030—2005 的重要兼容对象——GB 2312—80——这份标准也不是纯粹自造的,它很大程度上受到了日本工业标准 JIS C 6226-1978 的启发(也就是后来的 JIS X 0208)。虽然官方发布首版 JIS C 6226 是在 1978 年,但早在 1960 年代末、1970 年代初,相关标准就已经开始制定并发展了,这份标准可算是后续日、中、台、韩多字节编码字符集标准的源头。
至于国标本身的意义,在我看来最大的作用就是「强制力」的合法化。
- - -
最后,你还可以向自己提这样的问题:既然 ISO/IEC 10646 跟 Unicode 的关系如此紧密,那么它存在的意义又是什么?
不懂呢,不要乱喷,喷人也要讲基本法的
Unicode是什么,通俗地说是一套字符编号的标准,它规定了哪些叫字符,这个字符写出来是什么样子,然后赋予每个字符一个唯一编号。这个编号一定是正整数或者0。
此外还规定了某些编号表示控制字符,而不是代表实际可以书写的字符,比如 tab 换行 分段 左右阅读顺序转换标记等。
光有这些编号还是不够的,还要约定这个编号在计算机里怎么存储,于是有了 UCS-2 UCS-4 UTF-8 UTF-16等标准,这个叫Unicode的编码标准。
Unicode诞生其实是比较晚的,那么在Unicode诞生之前字符怎么编号呢?
计算机发明之初只有英文,美国人发明的嘛,所以 0-127 个字符就足够,后来扩展到0-255,这就是ASCII,由于欧美语言的特性就是拼音文字,字母很少,256个字符足够包括所有主流欧美语言的字母了,还包括了大量数字符号。
但是当计算机开始处理非欧美语言的时候 256个显然不够了,典型就是东亚语言,所有一个叫CJK的问题,就是中日韩的意思。
当时的主流解决方案是把字符编码扩展到2个字节,其中第一个字节高位为 1 表示 lead byte,配合后面一个字节来表示一个字符。
各个国家分别制定了各国的标准,这个标准每个国家都不一样,没有统一国际标准。
这些标准就是 中国 GB2312,日本的 shift-JIS 台湾(地区)的BIG5 韩国是 KS,它们规定了各个国家的字符都有哪些,编号多少,在计算机内存里怎么存储。
每个编码标准分配了一个编号叫 code page,GB标准就是 codepage 936
后来Unicode标准制定的时候,也遵照了这些标准,收录了它们的字符集,因为这些字符已经事实上在使用了,Unicode必须涵盖。
不是中国在造轮子,而是Unicode这个轮子出来太晚了,各个国家都在造轮子。
那么已经有了Unicode的情况下为什么还要有GB18030呢,因为GB2312编码标准里的汉字太少了,GB2312里只有 6763个汉字,显然不够用,需要一个字符集更多的标准。
中国民族文化复杂,有大量少数民族语言的字符要收录,所以需要一个自己的标准,这些字符进Unicode标准太难了,早期Unicode空间只有65536,显然严重不够用。
另外还要兼容过去的 GB2312,毕竟这么多年来大量的数据文献都是GB编码的,还要兼容着,日本也没放弃shiftJIS,台湾还在用BIG5。
GB标准的制定是要参照Unicode的,unicode里的汉字都有对应的GB编码,所以说GB18030是支持Unicode的。
其实ASCII也是一种codepage,而且美国还不止一种,比如常见的 Code page 437 是IBM PC的标准,Code page 1252 是Windows的标准,日本韩国也不止一种标准 日本有 JIS shift-JIS,韩国有 KS和UHC,中国也是大陆和台湾两套。
未来我相信编码会逐渐统一到 Unicode,但是各个国家的标准由于历史原因会长期存在。