Chinapub.com 下载 第20章ASC|1和字符映射 数字计算机存储器按位存储,所以,需要在计算机上处理的信息必须按位的形式存储 我们已经知道如何用位来表示数和机器码,下一个问题是如何用它来表示文本。毕境世界上 大量堆积的信息是文本形式的,就像装满图书馆的书、杂志和报纸。尽管我们最终要用计算 机来存放声音、图像和电影信息,但我们还是以较容易的文本存放开始 为了以数字形式表示文本,必须开发一些系统使得系统里的每一个字母有唯一的编码。 文本中也存在数字和标点符号,所以也必须有它们的编码。简单地说,所有的字母、数字和 符号都要编码,这样的系统叫作字符编码集,每一个编码叫作字符编码 第一个问题是:这些编码需要多少位?这并不是容易回答的问题 当考虑用位表示文本的时候,需要切合实际。我们习惯于看到书中、报刊、杂志上精 的文本格式,段落按照相同的间隔整齐地分成一行一行,但这些并不是文本的本质。当我们 在杂志上看到一个小故事,几年后在一本书中又看到同样故事的时候,我们不会因为书中文 本间距的不同而认为是不同的故事 换句话说,不要以这种印刷成行列的二维格式来看待文本,应该把文本看成是一维的字 母、数字和标点符号流,此外,也许还有额外的编码用来表示一段的结束和另一段的开始。 再来看看,如果在杂志上看到一个故事,后来又在书中看到同样的故事但字样有些不同 这是一个大问题吗?如果杂志上的写法为 Call me Ishmael 而书中的写法为 Call me Ishmael 这些差别难道是我们真正关心的吗?恐怕不是。印刷样式是微妙地影响了文本的观感,但故 事本身并没有因为样式的改变而不同。样式可以经常修改,但不会带来什么影响 接下来另外一个简化问题的方法是:用平版的文本。没有斜体,没有粗体,没有下划线 没有颜色,没有空心体,没有上下标,没有音调标记,没有A、白、i、o等符号,只有 99%英语文本里纯粹的拉丁字母 在对摩尔斯电码和布莱叶盲文的早期研究中,可以看到如何将字母字符表示成二进制的形 式。尽管这些系统在特定的场合应用地很好,但用到计算机里都有一些问题。例如:摩尔斯电 是宽度可变的编码:对常用的字符采用短编码,对不常用的字符采用长编码。这样的编码系 统适用于电报,但对计算机来说却不合适。另外,摩尔斯电码对字母的大小写没有区分。 布莱叶盲文是宽度固定的编码,很适合计算机。每一个字符由6位表示,也可以区分大小 写,尽管它是用特殊的 escape码来区分的,该代码表明下一个字符为大写。这也就是说,每个 首部字符需要两个代码而不是一个。数字用 shifti码表示,在这个特定的代码后紧跟的代码被 看作表示数字,直到又一个shf码将其转换到字符状态 我们的目标是开发一个字符编码集,使得像如下的句子 I have 27 sisters e
下载 第20章 ASCII码和字符映射 数字计算机存储器按位存储,所以,需要在计算机上处理的信息必须按位的形式存储。 我们已经知道如何用位来表示数和机器码,下一个问题是如何用它来表示文本。毕境世界上 大量堆积的信息是文本形式的,就像装满图书馆的书、杂志和报纸。尽管我们最终要用计算 机来存放声音、图像和电影信息,但我们还是以较容易的文本存放开始。 为了以数字形式表示文本,必须开发一些系统使得系统里的每一个字母有唯一的编码。 文本中也存在数字和标点符号,所以也必须有它们的编码。简单地说,所有的字母、数字和 符号都要编码,这样的系统叫作字符编码集,每一个编码叫作字符编码。 第一个问题是:这些编码需要多少位?这并不是容易回答的问题。 当考虑用位表示文本的时候,需要切合实际。我们习惯于看到书中、报刊、杂志上精美 的文本格式,段落按照相同的间隔整齐地分成一行一行,但这些并不是文本的本质。当我们 在杂志上看到一个小故事,几年后在一本书中又看到同样故事的时候,我们不会因为书中文 本间距的不同而认为是不同的故事。 换句话说,不要以这种印刷成行列的二维格式来看待文本,应该把文本看成是一维的字 母、数字和标点符号流,此外,也许还有额外的编码用来表示一段的结束和另一段的开始。 再来看看,如果在杂志上看到一个故事,后来又在书中看到同样的故事但字样有些不同, 这是一个大问题吗?如果杂志上的写法为 Call me Ishmael 而书中的写法为 Call me Ishmael 这些差别难道是我们真正关心的吗?恐怕不是。印刷样式是微妙地影响了文本的观感,但故 事本身并没有因为样式的改变而不同。样式可以经常修改,但不会带来什么影响。 接下来另外一个简化问题的方法是:用平版的文本。没有斜体,没有粗体,没有下划线, 没有颜色,没有空心体,没有上下标,没有音调标记,没有 Å、 é 、 、 等符号,只有 9 9 %英语文本里纯粹的拉丁字母。 在对摩尔斯电码和布莱叶盲文的早期研究中,可以看到如何将字母字符表示成二进制的形 式。尽管这些系统在特定的场合应用地很好,但用到计算机里都有一些问题。例如:摩尔斯电 码是宽度可变的编码:对常用的字符采用短编码,对不常用的字符采用长编码。这样的编码系 统适用于电报,但对计算机来说却不合适。另外,摩尔斯电码对字母的大小写没有区分。 布莱叶盲文是宽度固定的编码,很适合计算机。每一个字符由 6位表示,也可以区分大小 写,尽管它是用特殊的e s c a p e码来区分的,该代码表明下一个字符为大写。这也就是说,每个 首部字符需要两个代码而不是一个。数字用 s h i f t码表示,在这个特定的代码后紧跟的代码被 看作表示数字,直到又一个 s h i f t码将其转换到字符状态。 我们的目标是开发一个字符编码集,使得像如下的句子 I have 27 sisters。 n ˜ ˙ o ˙
208编的奥 Chinaopub.com 下载 可以用一串代码来表示,每一个代码具有一定的位数。一些代码用来表示字母,一些表示标 点符号,一些表示数字。甚至有代码来表示字间的空格。上面的句子中有18个字符(包括字 间空格),这样一个句子的连续字符代码常称作文本串 在文本串里,用代码来表示数字(如27)似乎很奇怪,因为前面许多章里已讲过用位来表示 数字。我们可能会用简单的二进制数10和111该句中2和7的代码,但用在这里是不合适的 该句中,字符2和7可像英文作品中出现的任何一种字符一样来看待,它们可能具有与它们的实 际值毫不相干的字符代码 也许最经济的字符编码是5位编码,它首先用于1874年的电报机,是由法国电报服务公司 职员 Emile baudot发明的。他的编码1877年被服务公司.纳,后来由 Donald Murray修改并在 1931年被CCIT,即现在的国际电联(ITU)标准化。该编码的正式名称是国际电报字母表 NO2或∏A-2,在美国通常称为 Baudot,尽管更科学的叫法为 Murray编码。 在20世纪, Baudot经常用于电传打字机。 Baudot电传打字机有一个键盘,除了只有30个 键和一个间隔棒外,有些像打字机。电传打字机的键实际上是转换器,它产生二进制代码并 且通过电传打字机的输出电缆一位紧接一位地传送出去。电传打字机也有打印机制,从电传 打字机的输入电缆输入的代码触发电磁铁在纸上打印出字符 由于 Baudot是5位编码,所以总共只有32个代码,这些代码的十六进制值范围从Oh~IFh 下表是32个代码所对应的字母表中的字符 十六进制码 Baudet字符 十六进制码 Baudet字符 00 T 02 Carriage Return(回车)12 06 16 Line feed(换行) 09 L Figure Shift(数字转义) OC P Letter Shifte(字符转义) 代码00h没有指定。其余的31个代码中,26个指定给字母表中的字符,5个用斜体字或短 语表示出来了 代码04h是空格代码,用来分隔不同的字:代码02h和08h表示回车和换行。这些术语来自 于电传打字机。当在电传打字机上打字并且到了一行的末尾时,按下一个杠杆或按钮来完成 两件事情。第一,使打印头回到开始处,以便从纸的左边开始打印下一行,这是回车。第二 移动打印头紧接至刚完成的那一行的下一行,这是换行。在 Baudot中,独立的键产生这两个 代码。打印的时候, Baudot电传打字机响应这两个代码,完成相应动作 在 Baudot系统里,如何表示数字和标点符号呢?这就是代码1Bh的作用,在表中标识为数 转义。在数字转义代码之后,所有的代码序列被看作是数字或标点符号,直到遇到字符转
208 编码的奥秘 下载 可以用一串代码来表示,每一个代码具有一定的位数。一些代码用来表示字母,一些表示标 点符号,一些表示数字。甚至有代码来表示字间的空格。上面的句子中有 1 8个字符(包括字 间空格),这样一个句子的连续字符代码常称作文本串。 在文本串里,用代码来表示数字 (如2 7 )似乎很奇怪,因为前面许多章里已讲过用位来表示 数字。我们可能会用简单的二进制数1 0和111作为该句中2和7的代码,但用在这里是不合适的。 该句中,字符2和7可像英文作品中出现的任何一种字符一样来看待 ,它们可能具有与它们的实 际值毫不相干的字符代码。 也许最经济的字符编码是 5位编码,它首先用于1 8 7 4年的电报机,是由法国电报服务公司 职员Emile Baudot 发明的。他的编码1 8 7 7年被服务公司采纳,后来由 Donald Murray修改并在 1 9 3 1年被 C C I T T,即现在的国际电联 (ITU) 标准化。该编码的正式名称是国际电报字母表 N O . 2或I TA - 2,在美国通常称为B a u d o t,尽管更科学的叫法为M u r r a y编码。 在2 0世纪,B a u d o t经常用于电传打字机。 B a u d o t电传打字机有一个键盘,除了只有 3 0个 键和一个间隔棒外,有些像打字机。电传打字机的键实际上是转换器,它产生二进制代码并 且通过电传打字机的输出电缆一位紧接一位地传送出去。电传打字机也有打印机制,从电传 打字机的输入电缆输入的代码触发电磁铁在纸上打印出字符 。 由于B a u d o t是5位编码,所以总共只有3 2个代码,这些代码的十六进制值范围从0 0 h~1 F h。 下表是3 2个 代码所对应的字母表中的字符 : 十六进制码 B a u d e t字符 十六进制码 B a u d e t字符 0 0 1 0 E 0 1 T 11 Z 0 2 C a rriage Return(回车) 1 2 D 0 3 O 1 3 B 0 4 S p a c e(空格) 1 4 S 0 5 H 1 5 Y 0 6 N 1 6 F 0 7 M 1 7 X 0 8 Line Feed(换行) 1 8 A 0 9 L 1 9 W 0 A R 1 A J 0 B G 1 B F i g u re Shift(数字转义) 0 C I 1 C U 0 D P 1 D Q 0 E C 1 E K 0 F V 1 F Letter Shift(字符转义) 代码0 0 h没有指定。其余的 3 1个代码中,2 6个指定给字母表中的字符, 5个用斜体字或短 语表示出来了。 代码0 4 h是空格代码,用来分隔不同的字;代码 0 2 h和0 8 h表示回车和换行。这些术语来自 于电传打字机。当在电传打字机上打字并且到了一行的末尾时,按下一个杠杆或按钮来完成 两件事情。第一,使打印头回到开始处,以便从纸的左边开始打印下一行,这是回车。第二, 移动打印头紧接至刚完成的那一行的下一行,这是换行。在 B a u d o t中,独立的键产生这两个 代码。打印的时候,B a u d o t电传打字机响应这两个代码,完成相应动作。 在B a u d o t系统里,如何表示数字和标点符号呢?这就是代码 1 B h的作用,在表中标识为数 字转义。在数字转义代码之后,所有的代码序列被看作是数字或标点符号,直到遇到字符转
第0ACl和字映209 下载 义代码(1Fh)再返回到字符状态。下表是数字和标点符号的代码。 十六进制码 Baudot字符 十六进制码 Baudot字符 0123 Who Are You? 4660 Line Feed 456789A OB & IC 实际上,ITU没有定义代码05h、OBh和16h,而是保留为“国家使用”,这个表里列出的 是美国的用法。这些代码在某些欧洲国家语言中用作重音符号。响铃代码用来敲响电传打字 机上能听见的铃声:“ Who are you”代码激活一种机制,用它电传打字机能识别自己 像摩尔斯电码一样,这5位编码不能区别大、小写。语句 SPENT S25 TODAY 由下面的十六进制数据流来表示: 0c04140D100601041B1619011F0401031218151B070208 注意三个转义代码:1Bh在数字的前面,1h在数字的后面,最后一部分之前又有1Bh。该 行代码用回车、换行代码来结束。 然而,如果一行两次传送该数据流到电传打印机,将会出现以下情形: I SPENT $25 TODAY 8“03,5$25 TODAY 这是怎么回事?打印机接收到的上一行的最后一个转义代码是数字代码,所以第二行开 始的代码被解释成数字 类似这样的问题是采用转义代码所产生的典型的令人烦恼的结果。尽管 Baudot是很经济 的编码,但人们可能更想采用能唯一表示字符或标点符号且对大、小写进行区分的代码。 如果想确定比 Baudot更好的编码系统需要多少位,只需把各种符号加起来:大小写字母 需52个代码,0~9数字需10个代码,这已经有62个,加上一些标点符号,则超过了64个代码, 这意味着需要多于6位的编码。但是距离128个字符数,似乎还有足够的余地。如果超过128个 符,则需要8位编码 所以答案应该是7。如果不用转换代码来区分大、小写,那么英文里应该用7位来表示字符 这些字符编码都是什么呢?当然,我们可以随心所欲地编码。如果打算自己制造计算机 且计算机的每一个硬件都由自己制造,自己编程且不把自己所造的计算机去与任何其他计算 机连接,则可以构造自己的编码,所要做的就是给每一个字符一个唯一的编码 但是因为很少有独立制造和使用计算机这种情形发生,所以通常是大家遵循并使用同
第20章 ASCII码和字符映射 209 下载 义代码( 1 F h )再返回到字符状态。下表是数字和标点符号的代码。 十六进制码 B a u d o t字符 十六进制码 B a u d o t字符 0 0 1 0 3 0 1 5 11 + 0 2 C a rriage Return 1 2 Who Are Yo u ? 0 3 9 1 3 ? 0 4 S p a c e 1 4 ‘ 0 5 # 1 5 6 0 6 , 1 6 $ 0 7 。 1 7 / 0 8 Line Feed 1 8 - 0 9 ) 1 9 2 0 A 4 1 A Bel (响铃) 0 B & 1 B F i g u re Shift 0 C 8 1 C 7 0 D 0 1 D 1 0 E : 1 E ( 0 F = 1 F Letter Shift 实际上,I T U没有定义代码 0 5 h、0 B h和1 6 h,而是保留为“国家使用”,这个表里列出的 是美国的用法。这些代码在某些欧洲国家语言中用作重音符号。响铃代码用来敲响电传打字 机上能听见的铃声;“Who Are Yo u”代码激活一种机制,用它电传打字机能识别自己。 像摩尔斯电码一样,这5位编码不能区别大、小写。语句 I SPENT $25 TODAY. 由下面的十六进制数据流来表示: 0C 04 14 0D 10 06 01 04 1B 16 19 01 1F 04 01 03 12 18 15 1B 07 02 08 注意三个转义代码: 1 B h在数字的前面,1 F h在数字的后面,最后一部分之前又有 1Bh。该 行代码用回车、换行代码来结束。 然而,如果一行两次传送该数据流到电传打印机,将会出现以下情形: I SPENT $25 TODAY. 8‘03,5 $25 TODAY. 这是怎么回事?打印机接收到的上一行的最后一个转义代码是数字代码,所以第二行开 始的代码被解释成数字。 类似这样的问题是采用转义代码所产生的典型的令人烦恼的结果。尽管 B a u d o t是很经济 的编码,但人们可能更想采用能唯一表示字符或标点符号且对大、小写进行区分的代码。 如果想确定比 B a u d o t更好的编码系统需要多少位,只需把各种符号加起来:大小写字母 需5 2个代码,0~9数字需1 0个代码,这已经有6 2个,加上一些标点符号,则超过了 6 4个代码, 这意味着需要多于6位的编码。但是距离1 2 8个字符数,似乎还有足够的余地。如果超过 1 2 8个 字符,则需要8位编码。 所以答案应该是7。如果不用转换代码来区分大、小写,那么英文里应该用7位来表示字符。 这些字符编码都是什么呢?当然,我们可以随心所欲地编码。如果打算自己制造计算机 且计算机的每一个硬件都由自己制造,自己编程且不把自己所造的计算机去与任何其他计算 机连接,则可以构造自己的编码,所要做的就是给每一个字符一个唯一的编码。 但是因为很少有独立制造和使用计算机这种情形发生,所以通常是大家遵循并使用同一
210编的奥 Chinapub coM 下 编码。这样制造岀来的计算机就可以与其他计算机兼容,并且可以交换文本信息 我们可能也不应该随意编码,例如,当在计算机上处理文本时,如果字母表上的字符是按 顺序进行编码的,则会带来很多好处,其码这样的顺序使得按字母排序和分类更容易一些。 幸运的是,我们已经有了这样一个标准,即美国信息交换标准代码,简写为ASCI码。它 1967年正式公布,此后一直是计算机工业界最为重要的标准。除了一个大的例外(在后面讲 到),可以肯定的是,无论什么时候处理文本,总会以某种方式涉及到ASCI码 ASCI码是7位编码,用二进制代码00000001111,六进制代码00h~7Fh来表示。 让我们来看ASCI码,但不要从最开始看,因为前32个代码比其余代码理解起来要困难一些 从第二批的32个代码开始讲起,它包括标点符号和10个数字。下表列出了它们的十六进制代 码及对应的字符 十六进制码 Asc字符 十六进制码 AsC字符 space 32 #$% 6789 注意20h是空格符,用来分隔单词和句子。 接下来的32个代码包括大写字母和一些附加的标点符号。除@符号和下划线之外,这些 符号在打字机上不经常出现,它们出现在标准的计算机键盘上: 十六进制码AsC字符 十六进制码 Asc字符 423 @ ABcDE F 6789ABcpE Z KLMNo
210 编码的奥秘 下载 编码。这样制造出来的计算机就可以与其他计算机兼容,并且可以交换文本信息。 我们可能也不应该随意编码,例如,当在计算机上处理文本时,如果字母表上的字符是按 顺序进行编码的,则会带来很多好处,其码这样的顺序使得按字母排序和分类更容易一些。 幸运的是,我们已经有了这样一个标准,即美国信息交换标准代码,简写为 A S C I I码。它 1 9 6 7年正式公布,此后一直是计算机工业界最为重要的标准。除了一个大的例外(在后面讲 到),可以肯定的是,无论什么时候处理文本,总会以某种方式涉及到 A S C I I码。 A S C I I码是7位编码,用二进制代码 0 0 0 0 0 0 0~1111111 ,即十六进制代码 0 0 h~7 F h来表示。 让我们来看A S C I I码,但不要从最开始看,因为前 3 2个代码比其余代码理解起来要困难一些。 从第二批的3 2个代码开始讲起,它包括标点符号和 1 0个数字。下表列出了它们的十六进制代 码及对应的字符: 十六进制码 A S C I I字符 十六进制码 A S C I I字符 2 0 s p a c e 3 0 0 2 1 ! 3 1 1 2 2 “ 3 2 2 2 3 # 3 3 3 2 4 $ 3 4 4 2 5 % 3 5 5 2 6 & 3 6 6 2 7 ‘ 3 7 7 2 8 ( 3 8 8 2 9 ) 3 9 9 2 A * 3 A : 2 B + 3 B ; 2 C , 3 C < 2 D - 3 D = 2 E . 3 E > 2 F / 3 F ? 注意2 0 h是空格符,用来分隔单词和句子。 接下来的3 2个代码包括大写字母和一些附加的标点符号。除 @符号和下划线之外,这些 符号在打字机上不经常出现,它们出现在标准的计算机键盘上: 十六进制码 A S C I I字符 十六进制码 A S C I I字符 4 0 @ 5 0 P 4 1 A 5 1 Q 4 2 B 5 2 R 4 3 C 5 3 S 4 4 D 5 4 T 4 5 E 5 5 U 4 6 F 5 6 V 4 7 G 5 7 W 4 8 H 5 8 X 4 9 I 5 9 Y 4 A J 5 A Z 4 B K 5 B [ 4 C L 5 C \ 4 D M 5 D ] 4 E N 5 E ^ 4 F O 5 F -
第0ACD和字符映2l 下载 接下来的32个字符包括所有小写字母和一些附加的标点符号,也是在打字机上不常出现的 十六进制码Asc字符 十六进制码 ASc字符 062666678 abcdefghijj 072345678yMB℃D y 注意该表中少了与7hh对应的最后一个字符。如果你一直在统计,这三个表总共列出了95 符。因为ASCI码是7位编码,可以有128个代码,所以还有33个代码可用。下面简单地讲 下这些代码 文本串 Hello, you! 可以表示成ASCI码的十六进制形式 48656c6c6E2C20796F752 注意除了字母代码以外,还有逗号(代码2C)、空格(代码20)和感叹号(代码21)。下 面是另一短句 用ASCI码表示为 注意句中数字12表示成十六进制数3h和32h,分别是数字1和2的ASCI码。当数字12作为文 本流的一部分时,它不应该被表示成十六进制码01h和02h,或者BCD码12h,或者十六进制 码0Ch。这些代码在ASCI里都表示的是其他意思。 ASCI码表示的大写字母与其对应的小写字母的ASCI码值相差20h,这使得编写某些程序代 码更为容易,如:把一个字符串变成大写。假设在内存的某个区域存放有字符串,一个字节放 个字符。下面的8080子程序假设字符串的首地址存放在寄存器H中:寄存器C存放有字符串 的长度,即字符串中的字符个数 Capita MOv A, C C= number of characters left(c为余下的字符数) CPI A, oOh Compare with0(与0比较) JzA11Done; If C is0,we’ re finished(如果c为0,则结束) MovA,[HL]; Get the next character(取下一个字符) CPI A, 6lh Check if it’s1 ess than"a(判断是否小于"a')
第20章 ASCII码和字符映射 211 下载 接下来的3 2个字符包括所有小写字母和一些附加的标点符号,也是在打字机上不常出现的: 十六进制码 A S C I I字符 十六进制码 A S C I I字符 6 0 ` 7 0 p 6 1 a 7 1 q 6 2 b 7 2 r 6 3 c 7 3 s 6 4 d 7 4 t 6 5 e 7 5 u 6 6 f 7 6 v 6 7 g 7 7 w 6 8 h 7 8 x 6 9 i 7 9 y 6 A j 7 A z 6 B k 7 B { 6 C l 7 C | 6 D m 7 D } 6 E n 7 E ~ 6 F o 注意该表中少了与7 F h对应的最后一个字符。如果你一直在统计,这三个表总共列出了 9 5 个字符。因为A S C I I码是7位编码,可以有1 2 8个代码,所以还有3 3个代码可用。下面简单地讲 一下这些代码。 文本串: Hello,you! 可以表示成A S C I I码的十六进制形式 48 65 6C 6C 6F 2C 20 79 6F 75 21 注意除了字母代码以外,还有逗号(代码 2 C)、空格(代码2 0)和感叹号(代码 2 1)。下 面是另一短句: I am 12 years old. 用A S C I I码表示为: 49 20 61 6D 20 31 32 20 79 65 61 72 73 20 6F 6C 64 2E 注意句中数字 1 2表示成十六进制数 3 1 h和3 2 h,分别是数字 1和2的A S C I I码。当数字1 2作为文 本流的一部分时,它不应该被表示成十六进制码 0 1 h和0 2 h,或者B C D码1 2 h,或者十六进制代 码0 C h。这些代码在A S C I I码里都表示的是其他意思。 ASCII码表示的大写字母与其对应的小写字母的ASCII码值相差20h,这使得编写某些程序代 码更为容易,如:把一个字符串变成大写。假设在内存的某个区域存放有字符串,一个字节放 一个字符。下面的8080子程序假设字符串的首地址存放在寄存器HL中;寄存器C存放有字符串 的长度,即字符串中的字符个数: Capitalize: MOV A,C ;C=number of characters left(C为余下的字符数) CPI A,00h ;Compare with 0(与0比较) JZ AllDone ;If C is 0, we’re finished(如果C为0,则结束) MOV A ,[HL] ;Get the next character(取下一个字符) CPI A,61h ;Check if it’s less than 'a'(判断是否小于'a')