代码改变世界

C语言Windows程序设计->第二天->ASCII与Unicode

2012-10-07 11:28  wid  阅读(5609)  评论(2编辑  收藏  举报

ASCII与Unicode

=========

一、ASC

1>. 关于ASC

  ASCIIAmerican 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。

 

     IBMASCII的主要扩展为: 补充了一些重音字符、小写希腊字母、块图字符和线图字符。同时还将一些补充的字符分配到ASCII的一些不必要的控制字符上。

 

     (在操作系统还是字符模式的年代块图字符和线图字符常用来被应用软件装饰自己的程序显示)

 

  微软公司的扩展方案

     198511, Windows 1.0发布微软采用了自己定义的一套字符集这套字符集被称为"ANSI字符集", 是基于ANSIISO标准的一个草案。

 

     在MS-DOS 3.3时代(19874), 微软为了使不同国家的计算机都能正常的显示字符微软采用了代码页概念不同国家的字符被规定在不同的代码页上例如代码页第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这一缺点可以慢慢忽略)