这几天帮朋友写一点代码,需要做多语言支持,顺便了解多语言字符集的原理,不想挺有意思,特别是字符集的演化和发展过程,实际上也反映了在需求逐步增加的背景下一个软件设计如何进化的过程。于是乎上网一阵狂看,拼拼凑凑写出这篇文章。
从ASCII编码说起
我们需要了解的最早编码是ASCII码。它用7个二进制位来表示,由于那个时期生产的大多数计算机使用8位大小的字节。那时候用到的字符很少,26个大小写英文字母还有数字再加上其他常用符号,也不到100个,因此用户不仅可以存放所有可能的ASCII字符,而且有整整一位空余下来。有些通讯系统利用剩下最高位1比特来做通讯中的奇偶校验。如果你技艺高超,也可以将该位用做自己离奇的目的:WordStar中那个发暗的灯泡实际上设置这个高位,以指示一个单词中的最后一个字母,同时这也宣示了WordStar只能用于英语文本。
为了支持非英语拉丁语系,于是出现了OEM字符集和ISO8859-1
随着计算机的广泛引用,人们发现仅仅用ASCII的127个字符是不够的,例如无法表示很多拉丁语系国家的字母表。由于字节有多达8位的空间,因此许多人在想:“呀!我们可以把128~255之间的编码用做个人的应用目的。”问题在于,同时产生这种想法的人相当多,而且在128~255之间的各个位置上应该存放什么这一问题上,真是仁者见仁智者见。事实上,只要人们开始在美国以外的地方购买计算机,那么各种各样的不同OEM字符集都会进入规划设计行列,并且各人都会根据自己的需要使用高位的128个字符。如此一来,甚至在同语种的文档之间就不容易实现互换。
ASCII可被扩展,最优秀的扩展方案是ISO8859-1,通常称之为Latin-1。Latin-1包括了足够的附加字符集来写基本的西欧语言。最后,这个人人参与的OEM终于以ANSI标准的形式形成文件。实际上,这个标准并不能说是一个字符集,而是一系列字符集,根据所在国籍的不同,处理编码128以上的字符有许多不同的方式。这些不同的系统称为代码页。同时,每个人都认同如何使用低端的128个编码,这与ASCII相当一致。
ISO8859-1详见:http://en.wikipedia.org/wiki/ISO/IEC_8859-1
为了支持亚洲语系,又出现了多字节字符集(MBCS)和中文字符集
但是人们又发现,256个字符对于拉丁语系语言是足够的,但对于亚洲国家语言是远远不够的!因此这些国家的人为了用上电脑,又要保持和ASCII字符集的兼容,就发明了多字节编码方式,相应的字符集就称为多字节字符集(MBCS,Multiple Byte Character Set)。例如中国使用的就是双字节字符集编码(DBCS,Double Byte Character Set):GB2312, GBK。
GB2312码就是中华人民共和国国家汉字信息交换用编码,基本集共收入汉字6763个和非汉字图形字符682个,用两个字节的区位码表示;区