科普:什么是数字技术

您所在的位置:网站首页 信号灯矢量图 科普:什么是数字技术

科普:什么是数字技术

2023-03-28 03:50| 来源: 网络整理| 查看: 265

1

 

第1章            以数字为语言

知识,是人类得以进化到地球生物链顶端的最重要武器。

在远古的地球上,人类为了捕猎动物聚在一起,通过各种奇奇怪怪的大呼小叫和指手画脚来商量战术。那个时候,人们互相之间只能表达最简单的意思,因为再复杂的含义实在是难以用哇哇的叫声和简单的比划表达出来。

10万年前,人类终于进化出复杂的语言系统,这是人类发展的一次飞跃,因为知识第一次有了可靠的载体。不过语言也有一个明显的缺点,就是无法“保存”。古人没有录音机,只能靠大脑记住一些句子,时不时也会记错,以讹传讹是经常发生的事,所以有些聪明人就把一些句子编成故事、歌曲和诗句,利用情节、音乐和韵律,来帮助大家记忆。这种方法在各民族都有使用——每个民族都有很多传说、歌谣和史诗。这种方法甚至一直在没有文字的民族里沿用了很久,比如以前蒙古传令兵,就是把命令编成歌曲,反复咏唱到熟记,然后在到达目的地后优美的“唱”出来。

5千年前,人类又发明了文字,因此可以把语言记录下来了。各民族的语言是多种多样的,所以文字的样子也是五花八门。如果你是一个古埃及或者玛雅的学者,恐怕学写字前得先学一段时间画画,而如果你是古代中国人,你就得先学点雕刻。

然而,人类那些丰富多彩的语言和文字,却让知识和信息的传播受到了局限。圣经里有一个故事,说的就是人类因为说着不同的语言,导致无法在一起工作,从而停止了修建通往天堂的伟大工程——巴别塔。(有意思的是,现在最著名的软件集成开发环境Eclipse,它的多国语言翻译项目,名字就叫Babel“巴别塔”),现代考古学家通过著名的罗塞塔石碑,如下图1-1所示——一块以希腊文、古埃及象形文字、古埃及通俗文字刻下的同一片文章,才成功的“破译”出古埃及文字的含义。

图1.1 古埃及文字

斗转星移,时光飞逝,在这个我们称之为信息革命的21世纪,借助文明积累至今的伟大科技,人类终于发明了一种能让所有人都能继承知识的方法,这就是——用数字作为语言的信息技术。

1.1            一种真正万能的宇宙通用语言

信息技术的伟大之处,在于不仅仅是提升人类对于物质的生产力,而是前所未有的提升了人类对于知识的生产力。信息科技没有发明什么语言,但是它发明了一种用来表达任何语言的语言,记录任何文字的文字,存储任何信息的信息,这,就是一种万能的通用语言!

1.1.1        结绳记事和寻找地外生命的信件

人类为了记录信息,发明过很多种方法。最为广泛的就是记录语言的文字。但是,其中有两种让我觉得最为特别。

其中第一种就是“结绳记事”,如下图1-2所示,古代中国人和印加人都留下过结绳记事的描述。大事就打一个打的结,小事就打一个小的结,多个事情就打多个结。或者使用不同颜色的绳子上的结来记录不同类型的事情。这种打结记事的方法,虽然没有能完整的流传下来,但是绳结本身,向我们展示了古人在记录信息方面,富有天赋的一面。

图1-2 结绳记事

我们可以注意到,绳结本身具备的状态并不多,只有大小、数量、顺序、位置,甚至是颜色和绳结类型的差别。对比于复杂的文字,这是一种非常简洁的记事方式,因为最简单的拼音文字往往也要用到几十个不同的字母。

另外一个方面,绳结不像文字依赖于语言,而是一种独立的记录信息的方案。这种方案虽然可能粗燥笨拙,但是好处是准确清晰。因为某个人说的“一批羊”可能是十几只,而另外一个人说的“一批羊”可能有上百只。

从结绳记事的创意中,我们能发现,除了语言以外,还有另外一种记录信息的方式,这种方式依赖于自己的一套规则,能使用一些简洁的表达方式,记录客观的事物。而不是如语言一样主要出自自己的主观感受。不管我们是否愿意相信,在研究了结绳记事之后,我们能总结出一个结论:一切“有序”的“差别”都能用来记录信息。

所谓“差别”我们通常称之为“符号”,任何能明确区别于其他状态的事物,都能形成“差别”,也就是符号。我们常见的符号有字母、象形字、数字这些可以雕刻或者书写在一些平面载体上的东西;然而手势、旗语、烽火、信号灯的闪烁同样也能成为一种“符号”;图像和声音则是包含了更加丰富信息的符号;摩斯电码是最广为人知,同时也很接近计算机数字信号的一种符号。绳子上的结,无疑也是这类符号中最古老的一员,绳结的大小、位置、打法,都代表着不同的状态,从而宣称自己的符号含义。

而关于“有序”的概念,在人类语言中也占有重要位置,一切的语言都有自己的语序,虽然可能不会一直恒定,但是总体来说是有一定规律的。比如中文、英文等语言中的主语-谓语-宾语序列,或者日语里面的主语-宾语-谓语顺序。语音的符号序列形成了句子,符号的序列则形成一个或一组含义。一条绳子上的结,就是这样形成了一个绳结的序列,从而变成一个有效的记录事情的方式。

计算机科学中,用来记录信息的方式,从某种方式来说,其实和结绳记事是一样的:它们都不和任何一种人类的语言挂钩,而是有自己独立的表达和解读信息的规则;它们都以直接记录客观事物为目地,而不需要通过主观感受的“转义”;它们采用最简洁的符号来记录信息,甚至简单到只有两个字母。——结绳记事和数字技术记录方法一样,都采用了很简单的符号,形成序列,以此来记录信息。只不过结绳记事的符号是大大小小的绳结,数字技术则是0和1;结绳记事用一根绳子来串起绳结,数字技术使用电磁载体上的磁道来刻写数字序列。

另外一种非常有趣的表达信息的方法,就是人类寻找地外生命的标志牌。在这个标志牌上,全世界最聪明的人,努力的设计了一系列的图案,如下图1-3所示,用来向那些和人类文明相差极远的智慧生命传递信息。

图1-3 标志牌

在这个图片上我们看到了人类自己的二维投影形象,这能让那些习惯于解读图形的智慧生命所理解;另外还画出了这个标志牌的来龙去脉——从太阳系第三行星出发,绕过了第4、第5行星飞向宇宙;另外还用简单的线条勾勒了人类所认知的所有基础自然学科的基本知识——天文、数学、化学、物理。

我们可能永远无法得知,真正的外星人会怎样看待这一张“充满智慧”的图案。但是我们可以肯定的是,地球文明至今所有最重要的科学知识,都凝聚在这些简单的线条和符号之中。这些符号代表着那些我们发现的自然规律,因此它们是一种表达规则的符号,尽管非常简洁,但是却能发展出无穷的变化来。这种高度凝聚的符号,正是人类另外一个,在信息表达上的高明之处。

我们不但善于铺陈描述一些事物,我们同样擅于总结和归纳。因此我们有了各种各样高度概括的概念,比如勾股定律、微积分、牛顿力学、相对论公式、化学元素周期表……。而在计算机科学中,我们同样继承了这些前辈的伟大遗产,通过用0和1这两种数字来描述这些自然规律的公式,拥有了在计算机中描述和模拟整个客观世界的能力。自然科学多年来使用数学工具来研究客观世界,而计算机科学对这些数学成果编码,从而把自然界的规律变成数字来存储、演算,这些表示规律的数字,就是计算机程序(软件)的重要部分。拥有了这些程序,我们就能利用计算机来模拟客观世界,从而获得重要的信息。事实上,模拟现实一直是计算机领域一个最重要的组成部分,从飞行导航、导弹弹道控制、核爆模拟到逼真的电子游戏——这些都是自然界客观规律,在计算机上表达和运算的成果。

数字除了可以用来静态的表达一些信息,同样也可以用来表达整个客观世界的规律,这些用来表达“动态信息”的数字,正是计算机变得无比强大的根本原因。

1.1.2 唱片、录音机、音乐盒和MP3

要理解数字化的特点,我们可以通过几种不同的记录声音的设备来了解。最古老的音乐盒,如下图1-4所示,通过发条驱动的的一条按照音节的节奏,频率排列的传输带的带动下,拨动一组可以发出不同音高的薄片,从而产生动听的音乐。然后是电唱机和唱片,通过刻画在原型唱片上的痕迹来记录声音,还有使用磁带的录音机,磁带上无数细小的磁性颗粒和磁头互相作用,产生电流的变化从而产生声音。

     

图1-4 音乐盒                                    

这些记录声音的设备,都有一个共同的特点,就是声音的记录载体和声音本身是同一个整体的,也就是说你不能简单的把一个唱片里的歌曲复制到一个音乐盒上。声音作为一种信息,在音乐盒、唱片、磁带里所记录的信号,都是完全不同的,在唱片和磁带里,就算是同样一首音乐,他们所记录下来的形式也是完全不一样的。如果要复制这样的声音,唯一的方法就是播放这些载体,然后从空气中或者电流里重新捕捉这些声音,再记录下来,因此复制的次数越多,失真就会越大。除了复制会导致失真,本身存放音乐的载体如果有些变化,声音也会随着失真,并且这种失真是无法察觉的。

然而在现代计算机的帮助下,我们已经很少使用上面三种设备了。因为我们有了MP3格式的声音——首先我们把声音通过采集设备,生成一系列长长的数字(记录在计算机里),然后使用MP3这种专门用于声音的压缩算法,压缩成比较短的一串数字。之后我们就可以很方便的把这些数字拷贝到任何可以存放数字信息的介质上,并且可以读取这些介质来播放音乐了。

数字信息的好处就在于一旦完成信息到数字的转化,这些信息将100%的记录和还原出来。不管你对数字信息拷贝多少次,都不会有一点点信息在拷贝的过程中丢失。这提供了对信息的一种最好的保持方式,因为我们可以不断采用新的存储介质来复制信息,而不必担心有信息的“损耗”,只要至少有一份拷贝留存下来,就可以把这些信息永久的流传下去。

同时这些信息也和信息的载体变得无关,从而可以记录在各种介质当中,比如硬盘、光盘、U盘,也可以通过电话线甚至无线手机网络传输。这种特性让我们在信息的存放、传输、利用上得到非常大的便利。我们不再需要像以前一样,对图像用胶片和化学药水来处理;对声音用唱片磁带来存放;对文字则用笔、纸、印刷机。我们可以用统一的一种设备——计算机,来对所有种类的信息,进行保存、修改、传输、展现。任何可以存放数字信息的介质,都可以用来存放“所有类型”的信息。这种“通用”的信息处理系统,正是基于把信息表达为数字的技术。

计算机本身和音乐盒、电唱机、录音机设备最大的不同,就是它根本“不理解”那些它在处理的“信息”。[f1]计算机对于声音、图形、文字或者别的信息,都一视同仁的看成是一个个数字。然后它严格的安装预先设定的“软件程序”去运算和操作这些数字。只有软件才理解数字化的信息。——这种让一些信息(软件程序),去处理另外一些信息(声音、图像、文本)的能力,让我们有能力用计算机去处理任何种类,并且可以是海量的信息。这种能力,让我们脱了信息载体和信息格式的局限,从而使我们对于信息的控制,提高到一种前所未有的强大境界。这种强大的信息处理能力,反过来强有力的推动了人类对于客观世界的认识和改造。

1.1.3 《先知》的启示

有一部非常有趣的电影,叫《先知》,剧情概括如下:

1959年,美国马塞诸塞州列辛顿威廉道斯小学,该校即将迎来校庆日,小女孩露辛达•安伯利提出的创意为校长所采纳。校庆日时,学生们将画下自己对未来的设想,并集中放入金属时间囊中埋入地下,准备50年后重新开启。校庆日之后,举止怪异的露辛达用鲜血在墙上写下奇怪文字,并向老师提出警告。  2009年,威廉道斯小学再次迎来校庆日,被埋藏地下50年之久的时间囊重见天日。小男孩凯勒得到露辛达的信,上面没有任何图画,整页布满毫无规律可言的数字。凯勒的父亲约翰夜晚研究这些数字,如下图1-5所示,竟发现这是一组具有预言性的密码。文中的数字清楚记录了世界上过去50年所发生的各种灾难。除此之外,这组数字还包括了接下来将发生的重大灾难。

图1-6 数字密码

电影中这张纸上的数字,初看起来似乎毫无意义,这些数字让我想起,我们在使用计算机的时候,时常会碰到的另外一个类似的情况——乱码。实际上,如果你用二进制编辑软件,打开任何一个文件(不管是文本文件、图片文件、MP3文件还是可执行文件),都能看到类似下图1-7所示的样子——密密麻麻的很多数字。

图1-7 数字

电影中的那些数字,第一次看起来无疑就是一堆“乱码”。 但是如果你明白了这些数字的规律,就能发现,其实这些数字包含了非常重要的信息。比如图中就显示出了02年华航空难的信息:时间5月25日,遇难人数225人,坐标23°59′N,119°40′E。在纸上的代码是:02525225235911940让“乱码”变得有意义的方法,就是理解这些数字所代表的含义。然而理解一个数字序列的含义,需要掌握两个关键的信息:

(1)数字在这个序列的组合规则:我们要知道这些数字是怎样被划分成一个个信息单元的。例如电影里面的数字“02-5-25-225-2359-11940”,表示“02年-5月-25日-225人-北纬23°59′N-东经119°40′E”,采用年、月、日、人数、维度、经度的规则,组合为一个事件单元。然后每个事件单元依次排列。对于计算机里的数据来说,同样也需要这种规则。我们要针对不同类型的信息,使用不同的组合规则来存放数据,这样我们才能使用程序来解析这些数据。

(2)这些数字对实际信息的编码规则:电影中的年份信息采用2位十进制数来表示,02表示的就是2002年;而是用经纬度的“度”和“分”的十进制来表达一个经纬度,如2359表示的是23°59′。我们知道这种编码的规则,就能具体解读出具体每一个数字所代表的信息。在计算机中,这种解读的过程叫做解码,对应的,把信息表达成某则规则的数字,叫做编码。所有存放在计算机中的数据(实际上就是很多数字),都有自己的编码/解码规则,这个规则正是用数字来表达客观世界信息的方法,比如说我们用数字来记录声音的频率,音高和时长,通过这些数字来记录和回放一段声音。通常我们光靠肉眼和大脑,很难去准确无误完成这种编码和解码的工作,但是我们借助编写软件,让计算机来做这个事情,却是非常高效的。

计算机所处理的一切数据,实际上都是按照类似电影里的这个方式来表达的,而理解这些数据的工作,正是我们编写软件来做的事情。程序员就好象电影里的“先知”和主角一样,运用对数字和客观世界里的信息的对应规则,来制作处理各种客观世界里信息的软件程序。这些软件程序被放入计算机之后,计算机就拥有了理解和处理对应的客观世界信息的能力。事实上,我们所认为的“乱码”,都是不存在的,那只是因为我们丢失了解读这些数字的程序,没有能力去理解和操作这些数据而已。这些数据还是一如既往的准确的表示着某些信息,就如同电影中还未能被解读的那张写满数字的纸一样。一旦我们理解了这些数字的格式,就能得到这些数字所包含的真正信息,从而让“乱码”变的不再“乱”。

数字代表了某种特定的信息,而软件包含了这些数字的规律。计算机就是用这种简单的方式,通过运行各种各样的软件,来处理对应规则(或者叫格式)的数字化信息。这正是所谓“数字技术”(或者叫“数码技术”)的核心概念。

1.2  文字是如何用数字来记录的

在人类创造的各种信息当中,文字信息一直被我们认为是知识和智慧的重要载体,古代无数僧侣和学者,终身都献身于书籍文字的保存和传达。很多书籍靠着一代代人手工抄写而流传下来。然而这种抄写费时费力不算,还常常会导致抄写错误,导致信息的“失真”。也有很多藏书因为保管不善而毁于腐朽或者战火。

在所有需要表达的信息当中,文字是最早被纳入“数字化”的信息种类之一。摩斯电码(Morse Code)是人们发明出来用电信号表达文字的最早方法之一,也是最早的数字化通信形式。通过断的电流,产生一种一系列按顺序排列的“代码”,从而可以用来表达文字。它的代码是:点(.)、划(-)、空(每个字符间的短停顿)、中等时间的空(每个词之间的中等停顿)、长空(每个句子之间的长停顿),如图1-8所示。有两种“符号”用来表示字符:点(.)和划(-),或叫“滴”(Dit)和“答”(Dah)。点的长度决定了发报的速度,并且被当作发报时间参考。这种方法除了可以用在电报上,也可以用于闪光等多种媒介上。

图 1-8 摩斯代码

现代计算机处理文字的方法和摩斯电码有一定的相似,只是用来代表文字的代码不再是点和划,而是真正的数字。一旦文字被计算机数字化之后,我们就拥有了一种永久性保存文字信息和快速、百分百准确的文字复制手段。当我们第一次知道:整个图书馆的书,被数字化后,只需要薄薄的几张光盘——这种载体体积的巨大差异,让我们倍感计算机的神奇。在现代几乎所有的高级编程语言中,字符或者字符串,都作为基本的数据类型存在。

1.2.1  美国信息交换标准代码

计算机界使用的最广泛的,用数字来表示文字的方案,就是如图1-9这个方案。你可以发现这个方案使用了0~127这128个数字,来代表128个字符,其中最常见的就是26个英文字母的大小写,以及10个阿拉伯数字,当然还有一批符号。这些符号中有些可以用键盘直接输入,有些则不能。这个表格,或者方案的名字,就叫做《美国信息交换标准代码》,简称ASCII。这个方案定义了我们在计算机世界中,最常见的英文字母和符号用哪些数字来代表。

图1-9 ASCII编码表

当我们从计算机里得到一串数字的时候,比如从文件里读取到,或者从网络上接受到的。我们完全可以按这个编码表来解读,比如我们可能会获得“72 101 108 108 111”这5个数字的时候,按表查询,就应该是Hello这5个字母。——这个看起来是不是有点像一组密码的解码过程?实际上,如果你在电脑里建立一个文本文件,输入Hello这5个字母然后保存,这个文件的内容就是72 101 108 108 111这5个数字。这和所有的别的文件一样,都只是一般的数字而已。你可以尝试把文件名改成a.exe或者别的什么名字,都不会改变这5个数字的内容。你也可以尝试用你的文本编辑器,在windows下是notepad,Linux下用cat命令,打开任何文件,只要文件里面存放的数字是符合上面这个表格的,都会被显示成对应的文字字符。可以说这个文本编辑器本身的功能,就是把数字转换成文字来显示。

图1-10 文字的数字化表达

这是一篇英文文章(马丁·路德·金《我有一个梦》节选)的txt格式内容,如上图1-10所描述,实际上是一系列的数字组成,需要注意的是,这里的数字是16进制格式显示的数字。在文章中,因为存在很多空格,所以我们很容易分辨出16进制的数字“20”,也就是十进制的数字32,这个数字正式ASCII所规定的数字。

有时候我会想,为什么ASCII中要把文字的“1”定义成49这个奇怪的数字呢?明明数字1代表文字的1不是很自然吗?这个原因我不得而知,但是我知道,如果我们使用不同的编码表来处理同一份数据,结果一定是非常混乱的。比如你用1来表达文字‘1’,我用49来表达‘1’,最后当我收到一个文件,内容是1这个数字的时候,我可能会显示出不是‘1’这个文字的内容。这就跟两种不同语言的人在对话一样。因此文字编码表本身,就是计算机界用来表达文字的语言规范。所以其实具体哪个数字表示哪个字符并不重要,重要的是要统一使用一份相同的编码表。

ASCII编码的顺序规则却是有明显意义的,你会发现0-9的编码是从小到大的,而字母都比数字要大,小写字母比大写字母大,这个编码方式的结果就是,如果你要按我们常见的习惯来对单词排序的话,直接使用这个编码表中的顺序,就可以直接排序了。

现在我们中文的编码表,是按照汉语拼音的排序顺序,来定义各个汉字的编码数字的,所以我们要按拼音排序,就变得异常简单,直接按他们的这些数据的大小排序就可以了!——这真是一件伟大的工作,我每次在使用汉字排序的程序的时候,都会从心底向制定汉字编码的中国科学家发出由衷的致敬。因为汉字有很多多音字,并且数量庞大,如果他的编码不是预先做好了这个排序,要程序员自己去实现这个功能,将是多么大的一个挑战!

1.2.2  乱码

乱码是我们在使用计算机处理文字的时候,最常碰到的问题之一,也是让我们觉得很困惑的事情。为什么我们在技术这么发达的时代,还会在文字这种看似简单的问题上碰到障碍呢?实际乱码的问题揭示了数字技术的一些本质,了解乱码产生的原因,能帮我们理解数字技术的核心概念。乱码的产生有三个原因:

      在数据的基本格式——长度分割上就是用了错误的编码规则。我们知道,英文字符一般都是用一个小于255的数字来表示,而中文字符因为远多于255,所以一般都要用2个字符,也就是在0到65535。既然这些数字一个个排列起来,就有可能因为错误的方式被解读——比如前一个汉字的后半部分和后一个汉字的前半部分被看成了一个字。如果你打开一个包含中文的文本文件,然后删除掉第一个中文字的第一个字节,你会发现整个文件的文字都不能正常显示了。这揭示了一个计算机处理文字的原理——所有的那些代表文字的数字,都是被无区别的,按顺序的一个个字节读取然后处理。顺序,是数字化信息中最重要的关键。

——在“黄”字删除掉一个字节的数据后,后面的所有文字都解释错误了,直到一个单字节的数字“06”之后,文字解释恢复了正常

      即使使用了相同的长度分割规则,但还是使用了错误的文字内容编码规则。这个最典型的就是gb编码和big5编码的问题。很多时候我们收到一个港澳台地区制作的文本文件,或者浏览这些地区的网站,会发现都是显示出一些奇怪的中文字,这就是因为这些地区的中文,都是用一个叫big5的编码规则来编码中文的,而大陆的电脑基本上都是默认按gb2312编码规则来显示中文,所以就会显示出错误的中文字符来了。

      对不是代表文字的数据,按文字的方式来解读。如果你想试验一下这个,可以随便找一个图片文件,或者exe之类的,把文件名改成“x.txt”,然后用notepad(记事本)打开,你通常都会看到“乱码”。实际上在互联网上,很多不是文本格式(也就是说不仅仅包含文字)的页面,都可以在错误的情况下,被浏览器按照文本格式读取,自然就会出现乱码了。这也再一次证明,计算机实际上是“不认识”它要处理的内容的,你命令它以文本编码方式去解码一串数字,它就老老实实的去做了,至于解码出来是什么东西,它是不管的。这必须使用者或者程序员去关心。

计算机无法把文字信息显示出来。要理解这种故障的原因,我们除了了解计算机如果处理文字的编码外,还需要了解计算机是如何显示文字的。实际上任何的文字,都是一张小小的图片。一个横向16个点和纵向16个点的点阵图,就可以表示所有的英文字符和数字,而中文则需要更大更多点的图像来显示。计算机预先会存放所有这些字符的“图形”,然后根据文字的编码,显示出对应的图形。但是如果计算机没有对应编码的图像,就往往会显示出一些奇怪的字符,最常见的就是显示一个“?”来代替。而这些字符对应的一大批的“图形”,我们叫做“字库”。如果你要显示中文,就必须要有中文的字库,否则计算机不会知道如何“画”出一个字来。我们时常碰到的,在某些电脑上能显示正常,另外一些电脑上则显示乱码的,很有可能就是字库没有能正确安装。

事实上,对于计算机来说,它是意识不到“何为乱码”的,它只是按照既定的编码规则,去把一系列的数字处理成软件预定的内容而已。我们人类看起来无法解读的一堆字符,对于计算机来说和可以解读的正常字符,都是一样的——它们都是一串串的数字。

1.2.3  万国一统Unicode

在整个世界,几乎都接受了ASCII作为英文文字的编码表,一直到现在这个编码规范还在默默的工作。然而中文文字就没有这么幸运了,大陆使用的GB2312编码规范和港台使用的BIG5就是对于中文文字不同的两套编码表。如果我们用BIG5的规则把一些汉字写入文件,比如“你好”,在文件了里记录的是数字“              42817 42606”,但是按GB2312编码规则读出的时候,却变成另外两个字,因为GB2312编码规则中的“你好”应该是“50403 47811”来代表的。如果我们想把日文、韩文,或者别的一些文字混合到同一份文件里,情况将变得更加复杂——想要对一个序列中不同部分的数字,指定不同的编码表的话,你就为每一个代表字符的数字前面,都用另外一个数字来表示应该用哪份编码表。

另外一个更聪明的办法是,把世界上所有的文字,都统一到一份编码表里面来——这就诞生了Unicode。和前文的ASCII编码表相比,Unicode编码表不仅仅为拉丁字母编码,同时也为全世界所有的文字都设计了编码。Unicode至今仍在不断增修,每个新版本都加入更多新的字符。目前最新的版本为第六版,已收入了超过十万个字符(第十万个字符在2005年获采纳)。Unicode发展是由非营利机构“统一码联盟”所负责的。

目前实际应用的Unicode版本叫USC-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示2的16次方个(即65536)个字符。基本能满足各种语言的需要。下图1-11所示就是用Unicode所显示的多国文字:

图1-11 Unicode文字

使用Unicode编码表来解决各种不同文字的混合显示问题的方法,展示了计算机以数字表达信息的一个通用原理:编码空间设计。如果要表达某种信息,这些信息里面,每个单元的“可能性”全集,决定了编码这个信息单元所需要的数字的长度。——因为英文字母只有几十个,所以使用0~255的数字就可以表示一个英文字母了。而中文字因为有上万个,所以就要用0~65535这么大的数字,才足够表达一个中文字。在计算机中,任何的信息,都遵守这个规律,比如要表达一副黑白图案,每个点只需要0和1两个数字就可以了,因此编码每个点的数字长度只需要用0~1这么小的数字,一连串的0和1就足够描述这个图案。而如果是彩色的图案,每个点所表现的颜色则需要要更长的数字来表达。就需要用一串0~255或者更大的数字来表达。

“用什么数字代表什么意思”的这个工作,就是所谓“编码表”,整个数字世界,就是由这样的各种“编码表”来规定各种各样信息所代表的数字的。

1.3  图片是如何用数字来记录的

除了文字以外,人类表达信息的另外一个重要手段就是图案。图画对比文字,更能在不同语言、不同种族间的人们之间传递信息。

1.3.1  如何在屏幕上显示“A”

我们使用的计算机,即便是最简单的“命令行”模式,实际上都是软件“画”出来的图案。如果没有图形能力,计算机就会是下图1-13所示的这种样子:

      

图1-13 纸孔带

看到那两个程序员在盯着穿孔纸带看吗?感觉是不是很“杯具”?所以即便是我们认为已经很普通很简单的字符界面,背后也有一套完整的图形数字化机制在运作的。我们已经知道了字符A在ASCII编码表中的代表数字是65,那么计算机对于要把65这个数字“画”到屏幕上,还需要做什么工作?

最基本的就是要找到字符A的图形数据,也就是要知道如何用一系列的黑色像素点,在白色的背景上,拼出A的形状。我们可以放大一下,看看屏幕上的A实际上是怎么样的一个图形,如下图1-14所示。

图1-14 图形A

这个图形,可以用一个11行8列的格子阵列来容纳,然后对于白色的格子用0表示,对于黑色的格子则用1表示。因此这个字符就可以按行分成11个数字的序列,而每个序列则从左到右的排列内容:

0 0 0 1 0 0 0 0

0 0 0 1 0 0 0 0

0 0 0 1 1 0 0 0

0 0 1 0 1 0 0 0

0 0 1 0 1 0 0 0

0 0 1 0 0 1 0 0

0 0 1 1 1 1 0 0

0 1 0 0 0 1 0 0

0 1 0 0 0 0 1 0

0 1 0 0 0 0 1 0

1 1 0 0 0 1 1 1

如果我们把数字排成一排,这将会是一个这样的序列:

000100000001000000011000001010000010100000100100001111000100010001000010010000111000111

虽然我们用肉眼看起来非常的晕,但是计算机却可以很轻松的处理这么长一串数字,它只需要按每8个数字一行的规则,把黑色或者白色的点画在屏幕上就可以了。除了A这个字符外,所有需要显示的字符,实际上都需要有类似上面的这串数字,作为描绘字符到屏幕上的数据的。这样一批代表字符“图形”的数字,往往被打包到一块,成为“点阵字库”。

同样的一个字符,可以具备多个不同的字体,只要我们用不同的点阵字库来负责“描绘”,就能得到不同的字体的显示,所以我们现在看到的,在屏幕上或者打印机打印出来的字符,都是由各种各样的点阵字库所控制的。

把要显示的图形,划分成很多小格子,然后对每个格子里面的内容用数字编码,然后把这些数字都串起来,是计算机记录图形最基本的方法。

1.3.2  绚烂的画面变成冗长的数字

对于仅仅有黑白两色的字符,可以用0和1的序列就可以完整的表达,但是如果是彩色的图案呢?其实方法也是非常类似的,我们可以看看下面这个例子,这是一个如下图1-15所示的老虎头。

图1-15 老虎头

如果我们把这个图形放大,就可以用一系列小方格来“近似”的描绘出这个图形,如下图1-16所示。

图1-16 放大后的老虎头

这个时候,我们只需要用点阵字库的方法,同样为每个点使用一个数字,来表示这个点的颜色,就可以了。当然因为我们用的是彩色图形,所以只用0和1是不足够的,对于颜色比较简单的图画,我们用0~4096之间的数字来表可能出现的颜色,应该就足够了,具体的的编码规则其实很简单,就是把所有的颜色,先分解成红、绿、蓝“三原色”,然后根据这三种颜色的深浅程度各自分为255个等级,用255以内的数字来表示,这样一个颜色就会是“红色等级”“绿色等级”“蓝色等级”这样三个数字,这三个数字的最大值都是255,放到一起相乘,就会是16777215,也就是说每个点实际上可以显示166777215种颜色(实际上人眼很难辨认出166777215种颜色中的全部颜色)。这个是不是和ASCII编码表有点类似呢?是的,这只是一种为了用数字表示颜色而做的编码表。通过这个编码表,就可以把这个图案完全数字化成为一串由166777215以内的数字,所拼接起来的数字序列。

显然如果我们每个点都用166777215这么大的一个数字来表示,一幅图片将会要用很长很长的一串数字来表示。而从这副图片看,这里面大多数的数字都会是相同的,因此我们可以用一种叫“调色板”的方法,来大大的减少表示这幅图案的数字长度:

首先我们把这份图片里面用到的颜色都先抽取出来:比如黑色、白色、绿色、浅黄色、三种棕色、三种红色。然后我们用0-9为这10种颜色编号,并且把表示这10种颜色的数字,都先串起来,这样我们就得到了10个166777215以内的数字——这10个数字就是这幅图片的调色板,包含了这幅图案的所有颜色信息。最后我们把代表整福图案的数字,全部都用“调色板”中颜色所对应的编号来代替,这样整个图案就会变成一串0-9之间的数字的序列,这串数字就大大的缩短了。最后我们把“调色板”和点阵图的数字拼到一起保存,就得到了最终图像的数据。如果需要显示这串数字所代表的图案,只需要先读出“调色板”,然后再读出每个点的数字,去“调色板”那里查找一下,获得最终的颜色数据,根据这个颜色数据去显示对应的颜色(这环节显示卡的驱动程序会完成),就能还原这幅图案了。

上面所说的显示彩色图形的方法,其实只是显示黑白字符的一种扩展,都是用“点阵”作为基础的描述方式的方法,这种方法有一个专用的名字叫“位图”。然而除了位图方式来表达图形,还有另外一种叫“矢量图”的方式。矢量图不去把图形分割成很多个小格子来描述,而是把图形中的线条都描述成函数曲线,然后记录这些代表这些函数的数字,来表达图形。这种方法的好处是图片无论如何放大,都一定不会失真,因为函数曲线不会因为放大而变化,缺点就是,如果要把图片用函数来编码,需要很复杂的计算,所以现实和保持这些图片比较耗费CPU的运算时间。互联网上流行的FLASH图画,很多就是用矢量图方式来制作的。

1.4  其他的信息是如何用数字来记录的

前面我们探讨了如何用数字来表示文字和图形,这两种不同的信息的数字化方法中,其实是有一些共同点的:

      把信息分解成很多单元。数字化文字信息的时候,就是按照每个字符进行分解,把一篇文章分解成很多个字符,每个字符作为一个信息单元。处理图形的时候,则是按照图形的平面,分解成很多个小格子,每个格子作为一个信息单元。

      对每个单元的所有可能情况,建立一个编码表。对于文字信息,每个单元的可能情况,就是所有可能出现的字符,所以需要为每个字都建立一个编号,从而形成文字的编码表。而对于图形,每个单元的可能情况,则是每个格子可能显示的所有颜色,所以需要为每个颜色都建立一个编号,于是我们就按照三原色分解,并且把每种原色划分255个深浅程度来编码。

      根据分解的单元和编码表,把信息变成一长串的数字。文字就是把按编码表生产的数字组合起来,表示一系列的文字。图形则是把代表各种颜色的数字组合起来,表示一幅图案。

以上三个共通的做法,除了用来表达文字和图形,同样也可以用来表达很多其他的信息,比如声音,我们可以把声音按时间分解成单元,然后对每个单位时间里的声音,按照其频率和音量编码。最后把一个声音变成一串以频率、音量所编码的数字。对于动画,也可以按时间分解成一帧帧的画面,每幅画面再以数字编码,这样由多组表示画面的数字所串接的序列,就可以用来表示动画了,GIF格式的动画就是用这种方式记录的。如果你要记录的是类似电话本之类的数据,则一样是先把电话本的条目先分解,然后再把每个条目分解成“名字”、“电话号码”两个部分,最后以文字编码表来编码“名字”和“电话号码”,最后把这些编码后的数字一起串接起来,形成一个完整的电话本。

任何的信息,只要有办法进行分解,编码,就能变成数字放到计算机里处理。所以现代的计算机几乎可以处理任何我们能接触到的信息。而指挥计算机去“解码”(把数字变成信息)和“编码”(把信息变成数字)的方法,正是计算机软件最常见的工作。

1.5  贻害甚广的“二进制文件”

我们时常会这样形容一个文件:“这是一个文本文件,这是一个图片文件,这是一个Word文件……”,但是当我们无法说出一个文件的类型的时候,我们就会说:“这是一个二进制文件”,然而,这个说法有几个严重的概念错误,从而阻碍了我们对于解决文件格式所能做出的反应:

      所有文件都是二进制的,但没有一种叫“二进制”的编码格式。二进制是计算机用来记录数字的一种方式,但是这种数字的记录,必定要有其所代表的实际含义,才真正的有用,所以一定要有对应实际信息的编码格式。我们如果说一个文件是“二进制”的,实际上和没有说“二进制”这个词是一样的。或者这么说仅仅是表达“未知编码格式”文件的意思,但是这样会误导听到这个说法的人,让他试图去寻找一种“打开”二进制文件的方法。事实上也真的有打开“二进制”文件的软件,但是这种软件一般来说没有太大的实用意义,因为如果让你看到一串不明含义的数字,又能做什么呢?

      每个文件都有它的编码格式,就算你不知道,它还是按自己的格式编码的。我们往往因为认为一个文件是“二进制”的,就怀疑这个文件是无法被解读的。但是实际上任何文件都一定有解读的方法,只是你还没知道他的格式,或者没有对于的解读软件而已。就如同你没有安装Adobe PDF Reader软件,那些PDF格式的文件,对于你来说就是“二进制”格式一样,如果你装了这个软件,这个文件就变成一种可用的格式了。因此你所认为的“二进制”实际上也是毫无意义的。

      任何格式的文件,本质上都是数字,并不一定是要看成是二进制的。虽然计算机底层确实是用二进制的方式来记录数字的,但是从软件层面看,任何的数字,都可以被编码成任何一种进制,而在实际的软件开发中,程序员们处理数据最常用的往往不是二进制,而是16进制。原因是对比二进制,用16进制来写一个数字显然简短的多;对比十进制,16进制又能更容易的换算成二进制数字,用来控制计算机底层。除了16进制,程序员们有时候还会用8进制,甚至别的一些数学进制。所以二进制本身并不能说是软件层面的唯一进制。用这个说法来表示文件格式,也是不尽准确的。

      文件名后缀仅仅是文件格式的提示,同样一种编码格式的文件可以有不同的后缀。比如说一个图片文件可以叫a.jpg,也可以叫a.jpeg,只要显示这个文件的程序,认识这两个后缀,并且都按JPEG的解码格式来显示这个图片,就一样能显示成功。然而如果你把一个wav格式的文件后缀改成jpg,你也可能可以打开这个文件,但是一定看不到任何有意义的图案。就好象你把一个图形文件后缀改成txt,就会得到一串文字“乱码”一样。

      文件格式的含义是丰富和多层次的,并不是每个文件只能有一种“格式”。比如我们常见的网页文件xxx.html,这种文件同时是文本文件和网页文件。你可以用“记事本”或者Word软件来打开,也可以用浏览器来打开。两种打开软件所显示的内容会完全不一样。同样的例子还有存放JavaScript的.js文件、XML文件等等。

希望我们在了解了计算机如何用数字来表达信息之后,我们能够理解计算机中各种文件格式的含义,而不会再被各种“格式”的说法弄的头晕脑胀。——一切都是数字,用数字表达的信息。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3