ASCII与Unicode
=========
一、ASCⅡ
1>. 关于ASCⅡ
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)
ASCII一共包含128个字符, 包括: 33个控制符号, 1个空格, 32个符号, 10个数字, 26个小写字母和26个大写字母。每个ASCII字符采用7位二进制编码的方式。
ASCII的优点:
十分可靠, 普遍扎根在我们的键盘、显示器、系统硬件、打印机、操作系统等, 用途十分广泛。
ASCII的缺点:
ASCII, 美国信息互换标准代码, 美国原生, 不能满足其他国家文字的需求, 例如, 中国的汉字?英国的英镑符号(£)?等, 这些在ASCII都是找不到的。
2>. 对ASCII的扩展
由于ASCII不能很好的满足其他国家文字的需求, 所以人们迫切希望能对ASCII进行改进。
①. 国际化标准组织的扩展方案
1967年, 国际化标准组织( ISO, International Organization for Standardization )推荐了ASCII的一个变种, 改动内容包括: 从ASCII中, 拿出 0x40('@'),、0x5B('[')、0x5C('\')、0x5D(']')、0x5E('^')、0x60(' ' ')、0x7B('{')、0x7C('¦')、0x7D('}')、0x7E('~')这10个符号保留给各个国家单独使用。这显然不是解决ASCII国际化的好方法, 首先, 其他国家将这些保留字符重新定义为自己国家需要的字符后, 那么国际上的一致性将不能得到保证, 此外, 10个保留字符远远不能满足美国的东方的一些国家使用的象形文字需求, 比如我们中国的汉字。
②. IBM公司的扩展方案
IBM公司采用了使用8位二进制编码方式来表示ASCII, 使用一个字节来储存字符, 这样, 相对于7位的ASCII就可以多出128个额外字符空位来补充ASCII。
IBM对ASCII的主要扩展为: 补充了一些重音字符、小写希腊字母、块图字符和线图字符。同时, 还将一些补充的字符分配到ASCII的一些不必要的控制字符上。
(注: 在操作系统还是字符模式的年代, 块图字符和线图字符常用来被应用软件装饰自己的程序显示)
③. 微软公司的扩展方案
1985年11月, Windows 1.0发布, 微软采用了自己定义的一套字符集, 这套字符集被称为"ANSI字符集", 是基于ANSI和ISO标准的一个草案。
在MS-DOS 3.3时代(1987年4月), 微软为了使不同国家的计算机都能正常的显示字符, 微软采用了代码页概念, 不同国家的字符被规定在不同的代码页上, 例如代码页第437页为美国英语, 850页为拉丁语-1。用户只要将代码页设置到自己所在的国家就能正常的进行工作, 但是如果用户尝试着将自己的文档拿到与另外一个使用不同代码页的用户的计算机上进行修改时, 自己的文档的某些字符将会显示成其他字符, 这还算好, 有解决方案, 应用软件可以通过将代码页信息储存到文件中, 使用时再进行一些代码页的转换。
但在后来, 随着代码页数量的剧增, Windows版本的不断升级, 代码页的混淆问题开始日益凸显, DS-DOS的代码页和Windows的代码页以及其他Windows版本的系统发生了不兼容, 例如MS-DOS代码页第855页西里尔语在Windows中的1251页西里尔语或者Macintosh的第10007页西里尔语还都不一样。
微软为了解决东方一些国家使用的象形文字问题, 使用了双字节字符集, 这些字符集同样在不同的代码页, 代码页936(简体中文)、949(韩文)、950(繁体中文)以及932(日文)。微软的这个双字节字符集和你象形的可能有所不同, 在这个双字节字符集中, 前128个字符仍然是ASCII(1字节), 较高的128个扩展字符以跟随第二个字节的方式用来表示象形文字(这两个字节被称为前导字节和尾随字节)。
所以在这个代码页中, 有一个字节的字符, 还有2个字节的字符, 这就导致了两个严重的问题:
1>. 在一段字符串中, 字符串的长度不能根据字节的个数确定, 要想确定字符串的长度必须检查每个字节是不是双字节字符的前导字节。
2>. 通过任意指向字符串中的一个指针, 无法知道前一个字符的地址, 通常要回到字符串的开始, 一直解析到指针所在的位置。
二、Unicode
对ASCII扩展的过程中, 没有能够找到一个彻底解决世界上所有书面文字的表示方法, 很显然, 1个字节, 256个字符是无法表示世界上所有的书面文字的, 因此, Unicode诞生了。
Unicode使用16位(2字节)的二进制编码方式来表示字符, 我们知道, 16位最多能够表示65536个字符, 65536个字符对于世界上的所有书面文字以及一些特殊符号来说已经足够用了。在Unicode中, 不同国家使用不同的代码段, 例如, 0x0530 - 0x058F为亚美尼亚语 (Armenian) 、0x0600 - 0x06FF为阿拉伯文 (Arabic) 、0x0E00 - 0x0E7F为泰文 (Thai) 、0x2700 - 0x27BF为印刷符号 (Dingbats) 、0x4E00 - 0x9FBF为中文。
Unicode的优点:
只有一个字符集, 避免了二义性, 能够满足跨语言、跨平台进行文本转换、处理的要求。
Unicode的缺点:
Unicode字符的字符串比ASCII字符串占用的内存大两倍。(笔者认为, 随着计算机性能的不断提高, 内存和外存容量的不断增加, Unicode这一缺点可以慢慢忽略)