ASCII码和字符转换
本文是基于《编码》、《穿越计算机的迷雾》两部著作进行读后整理的记录性博客。对书中较为重要的内容进行归纳整理进行二次创作,略去了繁琐的讲述细节,力求简明扼要。
正如我们在前面内容中的介绍一样,对于计算机我们知道它具备存储器能够存储二进制比特信息。但细细一想,我们不禁会产生诸多疑惑。例如,既然计算机存储的都是二进制比特信息,那我们的文本、音视频等多种格式的文件是如何在计算机中存储的呢?计算机为什么能够 “记住” 这些不同类型的信息呢?
数字计算机中的存储器唯一可以存储的是比特,因此如果要想在计算机上处理信息,就必须把它们按位存储。通过先前的学习,我们已经掌握了如何用比特来表示数字和机器码。现在我们面临的一大挑战就是如何用它来存储文本(本文我们以文本文件为例进行介绍,音视频等文件类似)。
为了将文本表示为数字形式,我们需要构建一种系统来为每一个字母赋予一个唯一的编码。这和我们前面介绍的一种人机沟通的方式类似,我们要想计算机 “记住” 这些属于我们人类认知的知识,必需定义一种规范——一种双方都能理解的规则。
简而言之,所有由符号所表示的字母和数字都需要编码。具有这种功能的系统被称为字符编码集(CodedCharacter Set),系统内的每个独立编码称为字符编码(Character Codes)。
了解了这种思想之后,我们便可以开始实现编码实现字符转换。首先要解决的第一个问题是:构成这些编码究竟需要多少比特?
如果每个设计计算机的人都构造自己的编码系统,并且独立使用,那么文件的互传互通将困难重重。显而易见的是,我们需要一套统一的规范的编码标准。
幸运的是,这种标准已经存在并且被广泛使用,它被称为美国信息交换标准码(AmericanStandard Code for InformationInterchange),简称为ASCII 码,发音很像 ASS-key。从 1967 年正式公布至今,它一直是计算机产业中最重要的标准。
ASCII 码是 7 位编码,它的二进制取值范围为 0000000~1111111,对应于十六进制就是 00h~7Fh。下表列出了其中 32 个字符及相应的十六进制编码(完整对应关系可以查看: ASCII_百度百科 (baidu.com) )。
有了这种编码方式,我们就可以将字符串转换成 ASCII 码。例如:I am 12 years old.,转换后用十六进制数表示为:49 20 61 6D 20 31 32 20 79 65 61 72 73 20 6F 6C 64 2E。
ASCII 码对英文字符与二进制之间的关系做了统一的规定,作为 7 位编码 ASCII 码一共规定了 128 个字符。但随之而来的问题是:英语用 128 个符号编码就够了,但是用来表示其他语言,128 个符号显然是不够的。不同国家有着自己的语言系统,也需要这样一套编码方式。显然,如果各个国家自己用自己的,那互通又成了一个繁琐的问题。
业界一直有一个目标,那就是建立一个独一无二的字符编码系统,它可以用于世界上所有语言文字,从 1988 年开始,几大著名计算机公司合作研究出一种用来替代 ASCII 码的编码系统,取名为 Unicode(统一化字符编码标准)。相对于 ASCII 的 7 位编码,Unicode 采用了 16 位编码,每一个字符需要 2 个字节。也就是说 Unicode 的字符编码范围为 0000h~FFFFh,总共可以表示 65,536 个不同字符。全世界所有的人类语言,尤其是经常出现在计算机通信过程中的语言,都可以使用同一个编码系统,而且这种系统还具备很高的扩展性。
Unicode 编码其实并不是从零开始设计的,例如前 128 个字符编码——即 0000h~007Fh——与 ASCII 码是一致的。全世界很多标准也被一同收录在 Unicode 中。Unicode 编码整合了部分之前的编码,并进行扩充。
对于 Unicode 来讲,它唯一的问题,就是它改变了字符与存储空间之间 “单字符,单字节” 的等价对应关系。采用 ASCII 编码方式存储的著作《怒火之花》,其所占据的存储空间约为 1 MB。而如果采用 Unicode 编码,约占 2 MB。为了使编码系统兼容,Unicode 在存储空间上付出了相应的代价。
随着后续的发展,Unicode 也逐步演化出 UTF-8、UTF-16 等,这里就不展开叙述。
ASCII 码和字符转换篇介绍了编码的发展以及产生,介绍了ASCII 编码和 Unicode 编码两种编码方式。为了精简内容删减了部分较为详细的书写,仅作为整理总结。