ASCII码、GB2312 与 Unicode:从英文字符到全球文字
ASCII解决了英语世界的字符编码问题,但计算机从来不是只给美国人用的。当它传到欧洲、亚洲,问题立刻暴露出来。法语里的é,德语里的ö,西班牙语里的ñ,在ASCII表里根本找不到位置。更不用说中文、日文、韩文这些完全不同的书写系统。ASCII的128个位置,对它们来说连零头都不够。
于是各个国家开始各自想办法。欧洲人把ASCII的7位扩展成8位,用最高位多出来的128个位置放本地字母。拉丁语系的ISO 8859-1就是这么来的。但中文没法这样处理,汉字有好几万个,128个位置塞不下。中国在1980年发布了GB2312,全称《信息交换用汉字编码字符集·基本集》。这是一套双字节编码方案,每个汉字用两个字节表示。为了和ASCII兼容,GB2312规定,如果一个字节的最高位是0,就按ASCII解释;如果最高位是1,就和下一个字节一起组成一个汉字。这样英文和中文可以混排在同一段文本里,系统读到0xxxxxxx就知道是英文字符,读到1xxxxxxx就再取一个字节,两个字节合起来查表得到汉字。
GB2312收录了6763个常用汉字,还有标点、数字、拉丁字母、日文假名等。它把汉字按使用频率和拼音、部首排列,一级汉字3755个,按拼音排序;二级汉字3008个,按部首排序。这套编码在中国大陆使用了很长时间,基本上覆盖了日常用字。但它也有局限,生僻字和繁体字不在其中。后来有了GBK、GB18030等扩展,把字符集越扩越大。
问题在于,全球同时存在太多编码方案。同样两个字节,在GB2312里是“中国”,换到日本的Shift-JIS里可能就是完全不同的字,换到韩国的EUC-KR里又是一堆乱码。一封用中文编码写的邮件发到日本,对方打开看到的可能是天书。这种编码割裂让跨语言交流非常痛苦。90年代,Unicode项目试图终结这种混乱。它的目标很简单:给世界上每一个字符一个唯一的编号,不管什么语言、什么平台、什么程序,都用同一套编码。
Unicode本身只是一个字符集,给每个字符分配一个码点,比如“中”的码点是U+4E2D,“A”的码点是U+0041。真正让它在互联网上流行起来的是UTF-8。UTF-8是一种变长编码,ASCII字符用一个字节,和原来的ASCII完全一样;其他字符用2到4个字节。这意味着已有的英文文本不需要任何转换,自动就是合法的UTF-8文本。中文在UTF-8里通常占3个字节。由于这种兼容性和灵活性,UTF-8很快成为互联网的标准编码,今天绝大多数网页、邮件、程序源代码都用它。
从ASCII到GB2312再到Unicode,这条路径反映的是计算机从美国走向世界的过程。ASCII奠定了单字节编码的基础,GB2312解决了中文在计算机上的表达,Unicode则把全球文字纳入同一个体系。编码的演进史,也是一部计算技术全球化的历史。今天我们在浏览器里输入中文、英文、日文、阿拉伯文,能同时显示、混合排版,靠的就是这几十年来一步步建立起来的共识。ASCII不是终点,但它定下的规则,至今仍在影响着每一个字符的存储和传输。