标准ASCII
“文本编码”是软件技术人员的基础知识。实际工作中,两个不同的应用程序之间经常通过“接口文件”(一般就是文本文件)来进行数据交换。此外,想学好“T-SQL语言编程”,也必须先过这一关。
学习这一讲之前,大家必须重温并彻底掌握《二进制和十六进制》讲义的知识。
一、 ASCII码的产生
“互联网”大家熟到不能再熟了。今天,没有互联网,世界会倒塌,而ASCII则是互联网的基石。
上世纪五、六十年代,电脑技术已取得了相当的进展。那时,美国人发现有个问题很头痛:张三电脑写的文档,无法交给李四、王五阅读。为什么会产生这个问题呢?
电脑的内存(或磁介质)是用二进制数来记录信息的。张三写了一份含3个字母(“ABC”)的文件,则在内存(或磁盘)里,只能以3个二进制数字的形式存在。假设张三在自己的电脑
系统中设定:“A”用00000001B(即01H)、“B”用00000010B(即02H)、“C”用00000011B(即03H)来表示。则张三保存在磁盘中的信息就是000000010000001000000011三个字节(这了节省编幅,下面尽量用16进制表示)。
当张三将磁盘交给李四后,问题来了:李四的电脑系统中,不一定将01H理解为“A”,同理,02H03H也不一定理解为“B”、“C”。所以,李四无法通过此文件“正确读到”张三想传递给他的信息(“ABC”)。
即是说,由于字符编码不统一,张三、李四无法进行信息沟通。电脑与电脑之间,不可能“互联”。
为此,美国国家标准学会(简称“ANSI”)制定了一套“美国信息交换标准码”(简称“ASCII”),它就是今天的庞大无比的互联网(以及一切IT技术)的基石。这张表很简单,如下图1
图1 标准ASCII码表
表中共有128个符号,例如:字符“A”的编码为41H01000001B)。查表方法:从最左列
读得16进制数高位,从最顶列读得16进制数低位,合在一起即得到该字符的编码。编码为两位16进制数字(即八位2进制数字)。最小编码为00H00000000B,名为“NUL”),最大为7FH01111111B,名为“DEL”)。
表中,从20H7EH之间有95可见字符,第1个(20H)是“空格”(表中用“SP”命名),编辑文本时,我们经常输入“空格”,注意,它属于可见字符(至少我们看见了一个空位吧)。最后一个可见字符是“~”。从00H1FH,再加上7FH,共有33不可见字符,由于“不可见”,所以,表中只能用“名字”来表示它们。比方,00H命名为“NUL”(表示“空值”。注意,不是“空格”),而7FH命名为“DEL”(意为“删除”。如果我们按一下键盘上的“DEL”键,一个7FH的数据就会被输送给CPU处理)。
“不可见字符”在文本中有什么用?有“控制”作用。例如,每行文本的结尾处,有回车符(0DH,名为“CR”)、换行符(0AH,名为“LF”)。当文本显示至本行最后一个可见字符后,遇到回车符,光标便移到本行行头,接着,遇到换行符,光标于是下移一行。所以不可见字符也称为“控制符”,它们很重要。
二、 实际观察一下ASCII
百闻不如一见,下面让我们亲眼看一看ASCII码与文本信息的关系。请先安装好文本编辑工具UltreEdit-32(可以从网上下载。我使用的是14.20.1.1000版。以下简称“UE”)。
按右键“新建-文本文档”,将新文档命名为“T1.txt”。双击T1.txt,系统将用“记事本”(WINDOWS默认的TXT文件编辑器)打开此文件。顺便说一下,不能用“写字板”,写字板不是纯文本编辑器。
2
123,
Aa Bb.
[    ]!
将输入法切换为西文”(我们以后再研究中文),然后,在文件中按右图2输入三行内容。第14个字符,第26个字符(中间有个空格),第3行由左方括、一个制表符、右方括、感叹号构成。输完第3行后不要回车(以免变成4行)。最后,保存此文件,关闭记事本。查T1.txt文件属性,显示文件大小为18字节。
刚才我们明明只是输入了“4+6+4”共14个字符,为何多出ascii共有多少个字符4个字符?让我们用UE来“解剖”一
下。
启动UE,打开T1.txt,可以看到上述三行文本信息(左边还标出了行号)。通过文本顶部的标尺,很容易知道当前光标在本行第几个字符上。这时,我们所看见的是文本信息的“字符模式”,在“字符模式”下编辑文本的方法与记事本几乎完全相同,不必多讲。不过,现在大家先不要作编辑。
点击菜单“编辑(EDIT)―16进制功能(HEX Functions)―16进制编辑(HEX Fdit)”,将编辑模式转换成“16进制码模式(简称‘HEX模式’)”。如果你嫌点击菜单太烦,也可以按“Ctrl+H”进行转换。顺便说一下,若重复此操作则又转换回“字符模式”。
HEX编辑模式下,编辑界面分为3部分:左栏为“地址区”,中栏为“码值区”,右栏为“符号区”。左栏和中栏以“:”分隔,中栏和右栏以“;”分隔。中栏、右栏可以编辑,左栏不能编辑。
我们先看中栏。UE16个字节为一行,将T1.txt的内容从第一个字节(31H,即“1”字)一直排到最后一个字符(21H,即“!”号)。将光标移到31H上,则右栏相应的“1”字会高亮(
反之亦然)。2CH(逗号)后面是0DH(回车符)、0AH(换行符),至此,文本(指字符模式下)的第一行结束了。再往后,41H61H20H42H62H2EH分别对应字符“Aa Bb.6个字符,同样,本行也是以0DH0AH结束。注意,大写“A”和小写“a”的ASCII编码不相同,而且,空格也是一个字符(20H)。继续向后,5BH09H5DH21H分别对应“[”、制表符、“]”、“!4个字符。这一行信息(即“[    ]!”)后没有回车符、换行符。
现在,我们已明白中栏、右栏的内容其实相同,只不过一边是编码,一边是字符。象ODH0AH09H这些不可见字符,在右栏一律借用一个圆点来占位。注意:这只是借用占位而已,真正的圆点的编码是2EH
左栏用于标示某个字节在文本中的地址(文件头的地址从0H起计)。比方,最后一个字符21H在文件中什么位置?将21H字符所在行的左栏数值(00000010H)与21H字符在本行内的位置数值1H(见顶行标尺)相加,得到00000011H,这就是21H字符在文本中的地址。11H即是十进制的17,由于文件第1个字符地址从0起计,末尾字符地址为17,所以,此文本共有18个字节。
现在,“多出4个字节”的原因到了:刚才我们少算了2个回车和2个换行符(在记事本中看
不见)。
三、 动手试验一下ASCII
1、 HEX模式的中栏里,将第1个字符(31H)改为30H,这时,右栏的对应符号从“1”变为“0”,查一下ASCII码表,30H正好对应“0”字符。这证明,中栏与右栏是“同步变化”的。
2、 按“Ctrl+H”切换回字符模式,可见到第一行已变为“023,”。点击保存此文件,关闭UE。然后用记事本打开T1.txt,可以看见第一行确实已变为“023,”了。这证明,改编码等于改字符。
3、 在记事本中,将光标移至“!”后,回车一次。这时,光标落到下一行(即第4行)的行头。点保存,并关闭记事本。查T1.txt的文件属性,大小变为20字节了。原来是18,为什么增加了两个字节?因为刚才在“!”后回车,导致增加了一个回车符、一个换行符。
4、 UE打开T1.txt,果然行号达到4了。切至HEX码模式,可见到21H后新增加了0DH0AH
5、 在地址00000014H(即最后一个字符0AH后面)写上2AH,点击保存,关闭UE。再用记事本打开T1.txt,看到什么?第4行出现了一个“*”号。查一下ASCII表,看“*”的码值是多少?2AH
认真做上述试验并细心体会,你将对ASCII码非常了解。下面我们再试验一下控制符在文本中的作用。
UE打开T1.txt,在HEX码模式下,将地址00000004H00000005H处的0DH0AH两个控制符分别更改为3FH(“?”)和40H(“@”),保存,关闭UE。再用记事本打开T1.txt,看到什么了?第一行变为“023,?@Aa Bb.”。显然,原来的第1、第2行合并成一行了。想一想,为什么会出现这种结果。想明白后,你就理解什么叫“控制符”了。
四、 “奇校验”和“偶校验”
一个字节共有82进制位,但是,按图1,每个编码的最高位总是0。为什么ANSI“浪费”了这一个2进制位?原因有两个:①美国人用英语,这128个符号已经够用了;②最高位用作“传输校验位”。
电脑A将一个字节(例如:01000011B)传送给电脑B时,偶然的传输错误可能导致电脑B收到的是01000010B(即是说,最后一位从1变成了0)。那么,电脑B如何知道自己收到的01000010B中否有错误呢?这就靠要靠“传输校验”技术了。
奇校验规定:所有传输的字节中1的个数必须是奇数,若非奇数,则在最高位添1,使之成为奇数;偶校验规定:所有传输的字节中1的个数必须是偶数,若非偶数,则在最高位添1,使之成为偶数。
举例,如果电脑AB约定,大家使用“偶校验”来进行数据传输,则当电脑A将想将字节01000011B传给电脑B时,它发现01000011B中“1”的个数是3个(奇数),于是,它马上将其最高位改为1(得到11000011B),再传给电脑B。万一传输过程中,电气不稳定,有一位发生了变化,电脑B收到11000010B,则电脑B马上能判断出这个字节不可靠(因为它有奇数个1),这时,电脑B会要求电脑A重传此字节。如果电脑B收到的是正确的11000011B,它就随即将它的最高位改回0(因为所有字符的最高位原来都为0)。
显然,如果同时有2个(或4个、6个)位发生了变化,则“奇偶校验技术”并不能发现这种错误。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。