1.2 计算机信息数据的表达和存储
1.2.1 计算机和二进制数据
在1937年到1942年之间,美国衣阿华州立大学(Iowa State University)的教授John V. Atanasoff的一个研究生Clifford E.Berry曾致力于一个电子计算机的原型开发。Atanasoff-Berry计算机(Atanasoff-Berry Computer, ABC)是首先采用真空管来替代机械式开关作为处理电路的计算机,它开启了基于二进制数字系统的计算的设计理念,如图1-18所示。ABC通常被认为是最早的电子数字计算机。所谓二进制数字系统,是指由一连串的位(bit)来表示数据或者状态。每个位有两个状态,“0”和“1”,由于电流的通断正好表示这两种状态,所以从20世纪30年代开始发展的电子计算机开始采用二进制数字系统作为计算机内部的数据计算和信息表达的基础。
图1-18 世界上首台具有二进制数字系统设计理念的计算机ABC
按照某历史学家的观点,“最初于1939年展示的ABC并不是完全意义上的计算机,正如莱特的原型不能被称为飞机一样,不过它确实开辟了道路”。
现代计算机采用二进制数字系统作为数据计算和信息表达的基础,究其原因,包括:
◉ 技术实现简单,计算机是由逻辑电路组成的,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。
◉ 简化运算规则:两个二进制数的和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。
◉ 适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制数只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。
◉ 易于进行转换,二进制数与十进制数易于互相转换。
◉ 用二进制数表示数据具有抗干扰能力强,可靠性高等优点。因为每位数据只有高低两个状态,当受到一定程度的干扰时,仍能可靠地分辨出它是高还是低。
深入研究表明,采用二进制数字系统的计算机的优点包括:数字装置简单可靠,所用元件少;只有两个数码0和1,因此它的每一位数都可用任何具有两个不同稳定状态的元件来表示;基本运算规则简单,运算操作方便。
而二进制数也存在缺点,用二进制数表示一个数时,位数太多。因此实际使用中,一般采用十进制数将数字送入数字系统,然后由计算机转换成二进制数进行处理和运算,运算结束后再将二进制数转换为十进制数供人们阅读。
1.2.2 数制转换
为了使得计算机可以进行正常的计算和数据表达,二、十进制之间必须有办法够相互转换,这种办法称为按权展开求和法。二进制与十进制间的相互转换介绍如下。
(1)二进制转十进制
方法:“按权展开求和”。转换规律:个位上的数字的次数是0,十位上的数字的次数是1, …,依次递增,而十分位的数字的次数是-1,百分位上数字的次数是-2, ……,依次递减。例如,(1011.01)2= (1×23+0×22+1×21+1×2^0+0×2-1+1×2-2)10= (8+0+2+1+0+0.25)10=(11.25)10。
注意:不是任何一个十进制小数都能转换成有限位的二进制数。
(2)十进制转二进制
十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法), Windows中的“计算器”程序可以验证(见图1-19)。
图1-19 计算器可进行二、八、十、十六进制整数的互转
【例1-1】 (89)10=(1011001)2。
89\2……1
44\2……0
22\2……0
11\2……1
5\2…… 1
2\2…… 0
1
十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)。
【例1-3】 (0.625)10= (0.101)2
0.625×2=1.25 ……1
0.25×2=0.50 ……0
0.50×2=1.00 ……1
在程序设计过程中,往往需要直接使用二进制数据进行计算和输出,但使用二进制数输入数据,程序书写过程中的数据会非常长,所以一般使用八进制或十六进制数来表达二进制数值。
二进制数转换成八进制数:从小数点开始,整数部分向左、小数部分向右,每3位为一组,用1位八进制数的数字表示,不足3位的用“0”补足3位,就得到一个八进制数。
八进制数转换成二进制数:把每个八进制数转换成3位的二进制数,就得到一个二进制数。八进制数字与二进制数字对应关系如表1.3所示。
【例1-3】 将八进制的37.416转换成二进制数。
即(37.416)8=(11111.10000111)2
【例1-4】 将二进制的10110.0011转换成八进制。
即(10110.011)2=(26.14)8
(3)十六进制与二进制的转换
二进制数转换成十六进制数:从小数点开始,整数部分向左、小数部分向右,每4位为一组,用1位十六进制数的数字表示,不足4位的用“0”补足4位,就得到一个十六进制数。
十六进制数转换成二进制数:把每个十六进制数转换成4位的二进制数,就得到一个二进制数。
十六进制数字与二进制数字的对应关系如表1.4所示。
表1.3 二、八进制转换表
表1.4 二、十六进制转换表
【例1-5】 将十六进制数5DF.9转换成二进制数。
5 D F . 9 0101 1101 1111.1001
即(5DF.9)16=(10111011111.1001)2。
【例1-6】 将二进制数1100001.111转换成十六进制数。
即(1100001.111)2=(61.E)16。
1.2.3 数字化的含义
计算机可以通过开关位和二进制数格式存储十进制数字。但是,二进制数字系统存在着某些限制。例如,许多早期的微型计算机系统的字长为8位,那么,这种计算机用二进制数可以存储的最大十进制数是多少?答案是255。如果把1赋给所有的8位,可以得到二进制数11111111,等于十进制数的255。
使用二进制数字系统,8位的计算机系统不能表示大于255和小于0的数。这样的计算机系统不会很有用处,因此计算机科学家发明了各种不同的方案来使用更多的二进制数位表示更大的数字和其他信息。因为这些设计方案普遍使用二进制数0和1,所以也被称为二进制编码或数字化。
数字化就是将许多复杂多变的信息转变为可以度量的数字、数据,再以这些数字、数据建立起适当的数字化模型,把它们转变为一系列二进制代码,引入计算机内部,进行统一处理,这就是数字化的基本过程。
例如,数字化可将任何连续变化的输入(如绘图的线条或声音信号)转化为一串离散的数字单元,在计算机中用二进制数位表示。通常,这个过程被称为模数(A/D)转换。
数字化是数字计算机的基础。若没有数字化技术,就没有当今的计算机,因为数字计算机的一切运算和功能都是用数字来完成的。数字、文字、图像、语音等各种信息,实际上通过采样过程后,都可以用由0和1组成的位串来表示,这样数字化以后的位串或位流是各种信息最基本、最简单的表示。因此计算机不仅可以进行计算,还可以演奏音乐、发传真、看录像,这是因为二进制位串可以表示各种数据和信息,进而可以描述千差万别的现实世界。
数字化数据的计量单位有MB、GB、TB、bps或b/s等。
1 bit = b(缩写为“b”,中文称为“比特”)
1 byte = 8 bit=B(缩写为“B”,中文称为“字节”)
1 KB = 1 024 bytes;1 MB = 1 024 KB = 1 048 576 bytes
1 GB = 1 024 MB = 1 048 576 KB;1 TB = 1 024 GB = 1 048 576 MB
计算机存储设备中一般使用字节作为计量单位。在计算机网络通信和数据传输过程中,一般使用bit作为计量单位。例如,一路数字化语音需要的带宽为64 kbps(bit per second)或64 kb/s,表示每秒传输64 000比特的数据。
1.2.4 文字信息编码
在计算机处理的数据中,首先遇到的问题是如何将各种文字信息输入到计算机中,即使是用于计算的数值,也要通过键盘或其他手段输入到计算机中,转换成二进制数据后才能计算。由于计算机发展历史上的原因,各种文字编码由简到繁,由拉丁文字发展到表意文字,不断地发展、分化、融合。计算机应用的平台有“桌面”和“网络”之分,不同编码方案的应用各有侧重,需要特别关注。
1.ASCII和ISO 8859-1
西文由拉丁字母、数字、标点符号及一些特殊符号所组成,通称为字符(character)。所有字符的集合称为字符集。字符集中,每个字符各有一个代码(字符的二进制数表示),它们互相区别,构成了该字符集的代码表,简称码表。
字符集有多种,编码也多种多样,目前使用的最广泛的计算机西文字符集及其编码是ASCII码,即美国标准信息交换码(American Standard Code for Information Interchange),它已被国际标准化组织(ISO)批准为国际标准,称为ISO 646标准。
ASCII码是7位编码,编码范围是00H~7FH(H为十六进制数的标识)。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。
标准的ASCII码是7位码,用1字节(8位)表示,最高位为0,可以表示128个字符,可以使用二进制数、十进制数或十六进制数来表示。其中,00H~20H和7FH共33个控制字符,其他代码可以用来表示数字、字母和标点符号等。数字字符0~9的ASCII码是连续的,为30H~39H;大写字母A~Z和小写英文字母a~z的ASCII码也是连续的,分别为41H~54H和61H~74H。因此,在知道一个数字或字母的编码后,即可推算出其他数字和字母的编码(见表1.5)。
表1.5 ASCII代码表
例如,大写字母A的ASCII码为41H或65,小写字母a的ASCII码为61H或97。
标准的ASCII码有94个可打印(或显示)的字符,称为图形字符。这些字符有确定的结构形状,都可以在计算机键盘上能找到相应的键,可将对应字符的二进制编码输入计算机,可在显示器和打印机等输出设备上输出。
只支持ASCII码的应用系统会忽略字节流中每个字节的最高位,只认为低7位是有效位。20世纪80~90年代的汉字字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。因特网中的邮件协议SMTP也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。
由于ASCII编码不能包含除英文以外的其他西欧语言的字母,因此ASCII编码在西欧国家并不通用。针对这个问题,ISO在ASCII编码的基础上进行了扩充,制定了ISO 8859-1编码(亦称为ISO Latin-1)。ISO 8859-1编码使用了一个字节的全部8位,编码范围是0~255。除ASCII收录的字符外,收录的字符还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。而欧元符号出现的比较晚,没有被收录在ISO-8859-1中。ISO 8859-1编码使用00H~1FH作为控制字符,20H~7FH表示字母、数字和符号等图形字符,A0H~FFH作为附加部分使用。因为ISO 8859-1编码范围使用了单字节内的所有空间,在支持ISO 8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO 8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin-1就是利用了这个特性。
西文字符集的编码较常见的还有EBCDIC码,该码用8位二进制数(1字节)表示,共有256种不同的编码,可表示256个字符,在某些厂商(如IBM公司)的一些产品中常使用。
2.GB 2312—1980、GBK和GB 18030
从1975年开始,我国为了研究汉字的使用频度,进行了大规模的字频统计工作,内容包括工业、农业、军事、科技、政治、经济、文学、艺术、教育、体育、医药卫生、天文地理、自然、化学、文字改革、考古等多方面的出版物。在数以亿计的浩瀚文献资料中,统计出实际使用的不同的汉字数为6335个,其中有3000多个汉字的累计使用频度达到了99.9%,而其余的累计频度不到0.1%。这说明了常用汉字与次常用汉字的数量不足7000个,为国家制定汉字库标准提供了依据。
国家标准汉字编码全称是“信息交换用汉字编码字符集(基本集)”,国家标准代号是“GB 2312—1980”,简称国标码,主要用途是作为汉字信息交换码使用。国标码中收集了7445个汉字及符号。其中,选入了6763个汉字,一级常用汉字3755个,排列顺序为拼音字典序;二级次常用汉字3008个,排列顺序为偏旁序;还收集了682个图形符号,包括数字、一般符号、拉丁字母、日本假名、希腊字母、俄文字母、拼音符号、注音字母等。在20世纪80年代,我国大陆的各种中文DOS版本、Windows 3.1/3.2版本,装入的字库都是国标一、二级字库。
国标码规定:一个汉字用2字节来表示,每个字节只用前7位,最高位均未定义。为了方便书写,常常用4位十六进制数来表示一个汉字。例如,汉字“大”的国标码是3473H(十六进制数)。
国标码是一种机器内部编码,主要用于统一不同的系统之间所用的不同编码。通过将不同的系统使用的不同编码统一转换成国标码,不同系统之间的汉字信息就可以相互交换。
随着信息技术在各行业应用的深入,GB 2312收录汉字数量不足的缺点显露了出来。例如,“镕”字曾是高频率使用字,而GB 2312没有为它编码,因而政府、新闻、出版、印刷等行业和部门在使用中感到十分不便。1995年,原电子部和原国家技术监督局联合颁布了指导性技术文件《汉字内码扩展规范》1.0版,即GBK。
CJK(CJK Unified Ideographs,中日韩统一表意文字):把分别来自中文、日文、韩文、越文的,本质、意义相同,形状一样或稍异的表意文字在ISO 10646及Unicode标准中赋予相同编码。
UCS(Universal Character Set,通用字符集):国际标准ISO 10646定义,所有其他字符集标准的超集,保证与其他字符集是双向兼容的,也就是说,如果将任何文本字符串翻译到UCS格式,再翻译回原编码,不会丢失任何信息。
汉字扩展内码规范GBK保持与GB 2312—1980的汉字编码完全兼容,同时在字库一级支持ISO 10646.1(GB 13000.1)的全部其他CJK汉字,且非汉字符号同时涵盖大部分常用的BIG5中的非汉字符号。GBK字符集中的汉字字序是:GB 2312—1980的汉字仍然按照原有的一、二级字,分别按拼音、部首/笔画排列;GB 13000.1的其他CJK汉字,按UCS代码大小顺序排列;追加的80个汉字、部首/构件,与上述两类字库分开,按康熙字典页码、字位单独排列。
1995年之后的实践表明,GBK作为行业规范缺乏足够的强制力,不利于其本身的推广。在银行、交通、公安、户政、出版印刷、国土资源管理等行业,对新的、大型的汉字编码字符集标准的要求尤其迫切。
为此,原国家质量技术监督局和原信息产业部组织专家制定发布了新的编码字符集标准,GB 18030—2000《信息技术 信息交换用汉字编码字符集 基本集的扩充》。GB 18030的双字节部分完全采用了GBK的内码系统。
3.BIG5汉字编码
BIG5汉字编码是我国台湾地区和香港特别行政区计算机系统中使用的汉字编码字符集,包含了420个图形符号和13070个汉字(不使用简化字库)。编码范围是8140H~FE7EH、81A1H~FEFEH,其中A140H~A17EH、A1A1H~A1FEH是图形符号区,A440H~F97EH、A4A1H~F9FEH是汉字区。
4.Unicode和UTF-8
Unicode是一种在计算机上使用的字符编码,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。它于1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也得到了普及。
一般来说,Unicode编码系统可分为编码方式和实现方式两个层次。
(1)Unicode编码方式
Unicode的编码方式与ISO 10646通用字符集(UCS)的概念相对应。目前,用于实用的Unicode版本对应于UCS-2,使用16位的编码空间,即每个字符占用2字节。这样理论上最多可以表示65 536(216)个字符,基本满足各种语言的使用。实际上,目前版本的Unicode尚未用完这16位编码,保留了大量空间作为特殊使用或将来扩展。这样的16位Unicode字符构成基本多文种平面(Basic Multilingual Plane, BMP)。
UCS的总体结构是一个四维编码空间,包含00H~7FH共128组(三维),每组包含00H~FFH共256个平面(二维),每个平面包含00H~FFH共256行(一维),每行共256字位(00H~FFH),每个字位用1字节(8位二进制数)表示。因此,在UCS中,每个字符用4字节编码,对应着每个字符在编码空间的组号、平面号、行号和字位号,上述4个8位二进制数编码形式称为UCS的4个8位正则形式,记为UCS-4。UCS提供了一个极大的编码空间,可以包括多个独立的字符集。每个字符在这个4字节编码空间中都有绝对的编码位置。
UCS中的表意文字采用中、日、韩汉字统一(CJK)编码方式,以现有各标准字符集作为源字符集,将其中的汉字按统一的认同规则进行认同、甄别后,生成涵盖各源字集并按东亚著名的四大字典(康熙字典、大汉和字典、汉语大字典及大字源)的页码序位综合排序,构成UCS中的表意文字部分(20902个字符)。已收入UCS的20902个CJK汉字,从中国的角度看,有17124个字源自GB;从中国台湾的角度看,有17258个字源自TCA-CNS;从日本的角度看,有12157个字源自JIS;从韩国的角度看,有7476个字源自KSC。它们采用2字节编码,现已被批准为我国国家标准(GB13000)。
UCS是一个由各种大、小字符集组成的编码体系。它的优点是编码空间大,能容纳足够多的各种字符集;缺点是引用不同的字符集信息量大,在信息处理效率和方便性方面还不理想。解决这个问题的方案是使用UCS的顺位形式的子集(UCS-2),又称为Unicode编码,其编码长度为16位。全部编码空间都统一安排给控制字符和各种常用大、小字符集。由于它把各个主要大、小字符集的字符统一编码于一个体系,既能满足多字符集系统的要求,又可以把各个字符集中的字符作为等长码处理,因而具有较高的处理效率。但是Unicode也有明显的缺点:首先,实用中几万字的编码空间仍嫌不足;其次,Unicode与ASCII码不兼容,这使目前已有的大量数据和软件资源难以直接继承使用,因而成为推广这种编码体系的最大障碍。
(2)Unicode实现方式
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致和出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Translation Format, UTF)。
例如,如果一个仅包含基本7位ASCII字符的Unicode文件,如果每个字符都使用2字节的原型Unicode编码传输,其第1字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码。OTF-8是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用1字节(首位补0);而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1~3字节编码,并利用首位为0或1进行识别。
如果直接使用与Unicode编码一致(仅限于上文提及的BMP字符)的UTF-16编码,由于Macintosh机和PC机上对字节顺序的理解是不一致的,这时同一字节流可能会被解释为不同内容,如编码为U+594EH的字符“奎”同编码为U+4E59H的“乙”就可能发生混淆。于是在UTF-16编码实现方式中使用了大尾序(big-endian)、小尾序(little-endian)的概念,以及BOM(Byte Order Mark)解决方案。
(3)UTF-8
在UNIX下使用UCS-2(或UCS-4)会导致非常严重的问题。用这些编码的字符串会包含一些特殊的字符,如’\0’或’/' ,它们在文件名和其他C语言库函数参数里都有特别的含义。另外,大多数使用ASCII文件的UNIX下的应用程序,如果不进行重大修改是无法读取16位字符的。基于这些原因,在文件名、文本文件、环境变量等地方,UCS-2不适合直接作为Unicode的实现编码。
RFC 2279中定义的UTF-8编码没有这些问题,它是在UNIX风格的操作系统下实现Unicode的常用方法。
用Unicode字符集写的英语文本是ASCII或Latin-1写的文本大小的2倍。UTF-8则是Unicode压缩版本,对于大多数常用字符集(ASCII中0~127字符),它只使用单字节,而对其他常用字符(特别是朝鲜和汉语会意文字),它使用3字节(见表1.6)。如果写的主要是英语,那么UTF-8可减少文件大小一半左右。如果主要写汉、日、韩语,那么UTF-8会把文件大小增大50%。UTF-8就是以8位为单元对UCS进行编码。UTF-8的一个特别的优点是它与ISO 8859-1完全兼容。这样,为数众多的英文文件不需任何转换就自然符合UTF-8,这对向英文国家推广Unicode有很大帮助。
表1.6 UTF-8的格式
UTF-8有如下特性:
① UCS字符U+0000H~U+007FH(ASCII)被编码为字节00H~7FH(ASCII兼容),这意味着只包含7位ASCII字符的文件在ASCII和UTF-8两种编码方式下是一样的。
② 所有大于U+007FH的UCS字符被编码为一个多个字节的串,每个字节都有标记位集。因此,ASCII字节(00H~7FH)不可能作为任何其他字符的一部分。
③ 表示非ASCII字符的多字节串的第一个字节总是在C0H~FDH范围内,并指出这个字符包含多少字节。多字节串的其余字节都在80H~BFH范围内,这使得重新同步非常容易,并使编码超越国界,且很少受丢失字节的影响。
④ UTF-8编码字符理论上可以最多有6字节,而16位BMP字符最多用到3字节。
5.文字编码的应用
各种文字的编码方案在不同时期的计算机产品中有所体现,例如,Windows 3.2采用的是GB 2312作为中文版的内码;Windows 95/98/ME则以GBK为基本汉字编码,但兼容支持GB 2312;而Windows 2000/XP/Vista/7则使用的是Unicode编码方式(其中汉字编码就是CJK方案)。桌面操作系统的进化步伐显然比万维网快得多,这是由Windows操作系统的应用普遍性决定的。但是,万维网的代码进化则受到诸多因素的制约,首先网络上大部分服务器的操作系统为UNIX/Linux类的产品,不能直接支持Unicode,而向UTF-8的转换需要大量的人力的投入。在现阶段,中文类网页发展的方向在万维网上是UTF-8,但是在相当部分的中文网站中,GB 2312和GBK仍大量存在。由于各种文字编码的存在,出现编码问题的几率也大量增加。下面的案例试图说明遇到此类问题的解决办法。
(1)全角和半角问题
由于汉字编码的特点,我们会遇到两个最基本且又非常重要的概念,那就是全角与半角。
形象地说,在使用英文输入法时,计算机屏幕上,一个英文字符(如ASCII码中的“a”)所占的位置被称为“半角”,而一个汉字所占的位置则等于两个英文字符,被称为“全角”。
在日常使用的计算机系统里,初始输入法一般都默认为英文输入法(输入的文字信息为ASCII码),这时自然会处在半角状态下,无论是输入字母、符号还是数字,始终都只占一个英文字符的位置。若切换到中文输入法状态下,则会有全角、半角两种选择。对中文字符来说,这两种选择没有影响,始终都要占两个英文字符的位置;但对此状态下输入的符号、数字以及英文字母来说,就显得很重要。例如,“QUAN”与“QUAN”,前者输入选择的是半角(在计算机中以ASCII码字母编码存在),后者为全角(依据操作系统的不同,可以是GB 2312或Unicode编码字符),两者在不同的应用程序中呈现的视觉结果会有差异,但有时候会被忽视。在选择全角后,即便是字母、符号、数字,都无一例外地要被当成汉字编码进行处理。
如果忽视半角和全角间的切换,会遇到一些怪事,如上网时经常要输入密码或网址,若此时在全角状态下进行,将因为系统无法确认(因为是完全不同的编码)而导致失败;在发送电子邮件的时候,把电子邮件地址写成xxx@xxx.com,即全角“@”的形式,而不是符合规定的半角“@”形式,结果也只能是无法成功发送邮件。要强调的是,在使用命令行输入计算机命令和参数,在程序设计环境中使用标点、符号和空格等场合,都要求使用半角(实质上是ASCII码)进行输入。而忽视这一点,会带来难以预料的各种问题,如系统反馈无法执行命令或程序编译失败等。
所以,绝对不能忽视全角和半角的差异带来的问题。在中文输入状态下,它们的情况会被显示在输入法提示栏中。比如,在智能ABC的提示栏中有相应按钮供转换,其形状为“半月”的是半角,“圆月”的是全角,可用鼠标单击“半月/圆月”或用快捷键Shift+Space进行全角和半角间的切换。
(2)解决网页浏览时出现的乱码问题
这种问题的产生,往往是网页内容的编辑对万维网的国际化程度认识不足引起的,有的HTML文件作者,特别是英文作者,在文件中不指定字符集。如果网页中使用了80H~FFH之间的字符,中文Windows又按照默认的GBK或GB 2312去解释,就会出现乱码。这种情况可以通过Firefox浏览器的属性页面来查看(见图1-20和图1-21)。
图1-20 测试网页使用出现乱码
图1-21 属性页面说明了问题:服务器默认使用GB2312,而网页使用了UTF-8但没有说明
这时只要在这个HTML文件中的<head></head>标记之间加上指定字符集的语句,例如:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
如果原作者使用的代码为GB 2312,即使没有在网页中说明代码,因为同服务器默认代码一致,也不会出现乱码。
(3)解决网站内容的更新问题
在某种e-Learning环境中,系统管理员每学期需要做的事情之一是把选课学生的资料以文本文件的形式批量上传,以便为新学期做好准备。某位系统管理员在为新近安装的课程管理系统上传学生名单时发现了新情况,内容中所有的ASCII字符完全正确,但是学生姓名等汉字信息则出现乱码,在一番检查后发现,新版课程管理系统要求使用UTF-8字符编码。
在Windows XP操作系统附带的“记事本”中,“另存为”对话框中可以选择4种编码方式,除去非Unicode编码的ANSI外,“Unicode”、“Unicode big endian”和“UTF-8”分别对应Unicode编码三种实现方式(见图1-22)。用“记事本”把文本内容按照UTF-8重新保存后,再次上传,则没有再出现乱码。
图1-22 Windows中的“记事本”可以转换文字编码
1.2.5 图像信息的表达
图形(如照片和图画)与包含数字和文字的文档不同。显而易见,计算机不能用字符编码(如ASCII)来存储和传送图形,计算机必须将图形编码成由0和1组成的位串来存储和传送。在计算机系统中,有两种非常不同的图形编码方法:位图和矢量图。这两种编码方法不同,不仅会影响到图像的质量、所用存储空间的大小,还会影响图像传送的时间和修改的难易程度。
(1)位图图像
计算机通过编码方式确定计算机屏幕每个像素(pixel)的状态并存储位图图像,如数码照片。位图图像包含的范围很广,既可以是简单的黑白图像,也可以是全真色彩的照片(见图1-23)。最简单的位图图像是单色图像(二值图像),所包含的颜色仅仅有黑色和白色两种。为了理解计算机怎样对单色图像进行编码,可以考虑把一个网格叠放到图像上。网格把图像分成许多单元,每个单元相当于计算机屏幕上的一个像素。
图1-23 位图与像素示意图
对于单色图像,每个单元(或像素)都标记为黑色或白色。如果某图像单元对应的颜色为黑色,则在计算机中用0来表示;如果图像单元对应的颜色为白色,则在计算机中用1来表示。网格的每一行用一串0和1来表示,计算机在存储单色图像时使用0来表示黑色像素,使用1来表示白色像素(见图1-24)。对于单色图像来说,用来表示全屏图像的位数和屏幕中的像素数正好相等。所以,用来存储图像的字节数等于总位数除以8。看看图1-24的计算,就可以知道它是怎样工作的。分辨率为250×130的单色图像需要32 500个二进制位。每个字节为8位,因此图像需要4062字节(4 MB),这个存储空间真不算大。但是,单色图像使用的机会并不多(如OCR),作为图像,它们看起来不太真实。
图1-24 250×130的单色图像的存储空间约为4KB
灰度图像用不同等级的灰色按比例显示位图图像。如果说单色图像如同剪纸的效果,那么,灰度图像则与黑白照片效果相似。使用的灰度级越多,图像看起来越逼真。为了表示如图1-25所示的灰度图像,计算机需要使用比单色图像更为复杂的编码方案。通常,计算机用256级灰度来显示灰度图像。
图1-25 灰度图像相当于黑白照片
对于256级灰度图像,需要使用多少二进制位呢?在256级灰度图像中,每个像素可以是白色、黑色或灰度中254级中的任何一个——共256种可能性。传送256个信息单元需要多少位呢?答案是8,28=256。这样,256级灰度图像的每个像素需要8位(1字节)。一幅分辨率为490×460的256级灰度图像需要225 400字节。
256色图像中,每个像素需要8位(1字节)。一个256色的全屏图像(分辨率为1024×768)需要786 432字节,是16色图像的存储空间的2倍,与256级灰度图像一样。照片质量的图像可以显示多达1670万种颜色,称为24位或真彩色图像。为了表示1670万色图像,每个像素需要24位(3字节)来表示。
图像文件可能相当庞大,这样大的文件需要很长的传输和下载时间。如果在家里从网络下载一个640×480大小的256色位图,要花费半分钟或更长时间。而下载16色同样大小的图像文件则可以减少一半的时间。
扫描的照片和其他常见图像通常被保存为位图图像。扩展名为.bmp、.pcx、.tif、jpg和.gif的文件,通常意味着文件中包含位图图像。文件扩展名通常作为文件格式的名称,如扩展名为 .gif的文件通常被称为“GIF格式文件”。
因为位图文件被编码为一系列的位串来表示像素,因此可以通过修改单个像素来修改或者编辑此类图像。可以使用位图图像软件(也称为“照片编辑软件”或“画图软件”)来修改位图文件。图像编辑软件能够将图片的局部进行放大,以便更加方便地对单个像素进行修改。因为按像素修改大幅图像是很乏味的过程,位图图像软件提供了一些附加的操作工具,如剪切、复制、粘贴和填充图片区域的颜色等。
位图图像软件具有修改照片级质量图像的能力,如可以润饰和修复老照片,润色新照片。一些常见的位图处理软件,如“光影魔术手”,可以批量处理和修改位图文件或数码照片(见图1-26)。
图1-26 可以处理照片的“光影魔术手”软件
(2)矢量图像
矢量图像由一系列可重构图像的指令构成。在创建矢量图像的时候,可以用不同的颜色来绘制线条和图形,计算机再将这一连串线条和图形转换为能重构图像的指令。计算机只存储这些指令,而不是真正的图像。矢量图像看起来没有位图图像逼真(见图1-27)。
图1-27 矢量图的常见效果
但是,矢量图像有几个优点,这使得它们非常适合用作绘制示意图。
① 可以把矢量图像的一部分当作一个单独的对象,单独加以拉伸、缩小、变形、上色、移动和删除,从而使得它在工程、创意和设计领域具有广泛的用途。例如,假设某矢量图像中包含一辆银色的汽车,你可以方便地把它移到不同的位置、放大或改变它的颜色。当缩小或者放大矢量图像时,对象也会按比例变化,以保证边缘平滑。位图中的圆形在放大之后会出现齿痕,而矢量图像中的圆形在任何尺寸下看起来都是平滑的。
② 同时,矢量图的存储空间比位图小得多。其存储空间的需求与图像的复杂性有关,每条指令都需要存储空间,所以图像中的线条、图形、填充模式越多,所需要的存储空间越大。矢量图像文件通常包含文件扩展名,如.wmf、.dxf、.mgx、.eps、.cgm。矢量图像软件是指“绘画软件”,而且在通常情况下,是与位图图像软件不同的软件包。流行的矢量图像软件包有Microsoft Visio、Corel DRAW和亿图等。
使用矢量图像软件来画一个图像时,可以使用画图工具来创建图形或物体,也可以通过选择不同的几何物体,连接不同的点,而创建不同的应用图形。例如,可以使用填充圆工具来画一个圆,并填充以颜色,通过选择和改变对象的位置、大小和颜色,可以将创建的多个对象组合成一个图像,加注必要的说明,如尺寸大小、对象的用途、图形的名称等。图1-28显示了怎样使用画图工具来创建一个矢量图像。
图1-28 亿图绘图软件可以绘制矢量图像
1.2.6 声音信息的表达
在计算机应用中,声音主要分为3种:
① 背景音乐,其主要作用是烘托气氛,引发目标受众的情结和情感,增强作品的感染力。针对不同的主题,应该配以不同风格、情调、节奏的音乐,使背景音乐和主题风格协调、一致。
② 旁白解说,其主要作用是强化画面信息,对画面信息进行补充说明。
③ 效果音乐。铃声、笛声、鸟叫等声音称为效果音乐,也称为音效,其主要作用是吸引目标受众的注意。
计算机中广泛应用的数字化声音文件有两类:一类是采集各种声音的机械振动得到的数字文件(也称为波形文件),其中包括音乐、语音及自然界的效果音等;另一类是专门用于记录数字化乐声的MIDI格式的文件。
常见的声音处理方法有:
◉ 声音信息的数字化,如将语言或磁带上的声音录制成音频文件。
◉ 对已有的数字化音频信息进行编辑,如截取音频文件片断,将WAV格式的文件转换为MP3格式的文件(这些内容将在第6章中描述)。
1.波形音频
波形音频是声音的数字形式表示。音乐、语音和自然界的各种声音都可以以波形形式进行记录。对于声音的数字记录来说,会周期性地对声音波形进行采样,并以数字数据的形式进行存储。图1-29显示了计算机怎样用数字方式对声音波形进行采样。
图1-29 计算机对音波信息进行数字化采样
音乐CD是按照样本速率44.1 kHz进行录音的,这意味着每秒进行44100次的声音采样。16位用于每个样本,为获得立体声效果,需要2倍的16位样本,因此每个样本需要32位的存储空间。当以44.1 kHz对立体声CD质量音乐进行采样时,一辑典型的音乐专辑CD(45分钟)需要454 MB的存储空间。
为了节省存储空间,不需要高品质音效的应用程序可以使用较低的采样速率。如果设定语音采样速率为8 kHz,即每秒采样8000次、单声道。这样,声音的质量比较低,而文件大小只有以44.1 kHz/16位/双声道录制的相似声音文件的1/25(见图1-30)。
图1-30 通过“声音选定”调整采样速率
存储在计算机上的波形文件的扩展名有.wav、.mod、.au和.voc等。可以使用Windows系统自带的“录音机”和“媒体播放器”程序来记录和播放波形文件,这些音乐文件播放通常需要通过声卡和扬声器配合。
2.MIDI音乐
MIDI(Musical Instrument Digital Interface,乐器数字接口)是电子乐器用来交流、传输信号的一种协议,相当于一个指令系统,其指令里包含各种器乐数据信息,这些信息通过MIDI线路发送给音源,音源按照指令发出声音。计算机中的MIDI文件包含MIDI乐器和MIDI声卡,用来重构声音的指令序列。尽管MIDI文件能存储和重构乐器声音,但不能存储和重构语音和声乐。MIDI文件比波形文件更为紧凑。3分钟的MIDI音乐仅仅需要10 KB的存储空间,而3分钟的波形音乐则需要15 MB的存储空间。
MIDI对音乐的影响很广,其中最重要的影响之一是改变了作曲的方式。MIDI是由乐器商建立的通信标准,它规定计算机、合成器(synthesizer)与其他电子设备之间交换信息和控制信号的方法。凭借各种MIDI软件工具、个人计算机和MIDI硬件,作曲家可以制作出复杂的、具有专业水平的乐曲。
MIDI是一个音乐符号系统,允许计算机和音乐合成器进行通信。计算机把音乐编码成一个序列,并以 .mid、.cmf或.rol文件扩展名进行存储。MIDI作曲与编写乐谱十分类似。MIDI谱曲操作包含音符的定调、开始音符、演奏音符的乐器、音符的音量和音符的时间等。
为了播放MIDI文件,可以使用Microsoft的媒体播放器;而MIDI的编曲可以采用MIDI乐器和设备,包括音乐工作站、合成器、电子琴、电钢琴、电子弦乐、电子管乐、电子打击乐、音源器、效果器、采样器和电子手风琴等。一些专门的软件如MIDI Tracker等,也可以用来编制MIDI音乐,如图1-31所示。
图1-31 电子合成器作曲软件MIDI Tracker的工作界面