《WINDOWS程序设计》(018)2.1 字符集简史-2.1.3 扩展ASCII码
本帖最后由 兰陵月 于 2018-10-21 21:49 编辑2.1.3扩展ASCII码
到了早期小型计算机发展的时候,8位字节的标准得以巩固。因此,如果用一个字节来存储字符,就有128个额外的字符可以用来补充ASCII。当最初的IBM PC在1981年推出时,视频适配器包括一个基于ROM的256个字符组成的字符集,这后来称为IBM公司标准的一个重要组成部分。注:当时是直接烧制在视频适配器上的,无法更改的。
最初的IBM扩展字符集包括一些重音字符和小写希腊字母(对表示数学符号有用),以及一些块图(block-drawing)和线图字符。增补的字符还被分配到ASCII控制字符的代码位置,因为大部分的控制字符不是必需的。
这个IBM扩展字符集被烧制在无数视频板和打印机的ROM中。它被许多应用软件用于装饰自己的字符模式显示。但是,这个字符集没有包括所有的使用拉丁字母的西欧语言的重音字母。而且这个字符集也不太合适用于Windows。Windows不需要线图字符,因为它有一个完整的图形系统。
在Windows 1.0(1985年11月发布)中,微软并没有完全放弃IBM的扩展字符集,但它被降级到次要低位。Windows自有的字符集被称为“ANSI字符集”,因为它是基于ANSI和ISO标准的一个草案,而此草案最终成为ANSI/ISO 8859-1—1987,“美国国家信息处理标准—8位单字节编码图形字符集—第1部分:拉丁字母第1号”。这也简称为“拉丁语-1”。
图2-2展示了印刷在Windows 1.0程序员参考上的原始版本的ANSI字符集。
空心长方形表示此编码位置代表未定义的字符。这非常接近于ANSI/ISO 8859-1最终的定义形式。ANSI/ISO 8859-1只显示图形字符,而不显示控制字符,因此它没有DEL(删除)的设定。此外,代码0xA0设定的是一个非断行的空格(这意味着在排版时,该空格不应该被用来断行)。代码0xAD设定的是一个软连字符(这意味着它不应该被显示,除非它用于在一行结尾处分解一个词)。另外,ANSI/ISO 8859-1定义代码0xD7为乘号(×),还定义代码0xF7为一个除号(÷)。某些Windows的字体还定义了从0x80到0x9F的某些字符,但这些不属于ANSI/ISO 8859-1标准。
MS-DOS 3.3(1987年4月发布)把代码页的概念介绍给了IBM PC用户。这一概念也接转到Windows操作系统。代码页定义了字符的相应字符码。原本的IBM字符集被称为第437页代码页,或“MS-DOS Latin US”(“MS-DOS 拉丁文 美国”)。第850页代码页是“MS-DOS Latin 1”(“MS-DOS 拉丁语-1”),它删除了一些线图字符,取而代之的是一些额外的重音字母(但并非是如图2-2所示的拉丁语1 ISO/ANSI标准)。其他的代码页是为其他语言所设定的。较低的128个代码总是相同的;高的128个代码取决于定义代码页的语言。
在MS-DOS模式中,如果一位用户把自己个人计算机的键盘,视频显示和打印机设置到特定的代码页,然后在计算机上创建、修改和打印文件,一切都会工作得很好。但是,如果用户试图与另一位使用不同的代码页的用户交换文件,或试图在计算机上更改代码页,则会发生问题。字符代码会关联到错误的字符。为减少问题,应用软件可以把字符页信息与文件一起保存,但这一策略涉及代码页之间转换的一些工作。
虽然代码页最初只用于拉丁字母集中非重音字符之外的额外字符,但最终代码页中较高的128个字符还是被用于非拉丁字母,如希伯来文、希腊文和西里尔语。当然,这么多种类的语言使代码页混淆的问题更加严重。几个重音字母显示不正确或许还能勉强阅读,但整篇文章全部乱码是根本不行的。
代码页的数量超乎情理地剧增。更有甚者,MS-DOS的西里尔语代码页(第855页)与Windows的西里尔语代码页(第1251页)或与Machintosh的西里尔语代码页(第10007页)还都不一样。每个计算机环境的代码页都对标准字符集进行了修订。IBM OS/2 还支持各种EBCDIC代码页。
这还不算,更糟糕的还在后面。
页:
[1]