本节书摘来自异步社区《鸟哥的Linux 私房菜 基础学习篇(第三版)》一书中的第0章,第0.3节,作者:鸟哥著,更多章节内容可以访问云栖社区“异步社区”公众号查看
0.3 数据表示方式
鸟哥的Linux 私房菜 基础学习篇(第三版)
事实上我们的计算机只认识0与1,记录的数据也是只能记录0与1而已,所以计算机常用的数据是二进制的。但是我们人类常用的数值运算是十进制,文字方面则有非常多的语言,常用的语言就有英文、中文(又分繁体与简体中文)、日文等。那么计算机如何记录与显示这些数值/文字呢?就得要通过一系列的转换才可以啦!下面我们就来谈谈数值与文字的编码系统。
0.3.1 数字系统
早期的计算机使用的是利用通电与否的特性的真空管,如果通电就是1,没有通电就是0,后来沿用至今,我们称这种只有0/1的环境为二进制,英文称为Binary。所谓的十进制指的是逢十进一位,因此在个位数归为零而十位数写成1。所以所谓的二进制,就是逢二就进一位的意思。
那二进制怎么用呢?我们先以十进制来解释好了。如果以十进制来说,3456的意义为:
特别注意:任何数值的零次方为1,所以100的结果就是1。同样,将这个原理带入二进制的环境中,我们来解释一下1101010的数值转为十进制的话,结果如下:
这样你了解二进制的意义了吗?二进制是计算机基础中的基础。了解了二进制后,八进位、十六进制就依此类推。那么知道二进制转成十进制后,如果有十进制数值转为二进制的环境时,该如何计算?刚才是乘法,现在则是除法就对了。我们同样使用十进制的106转成二进制来测试一下,如图0-15所示。
最后的写法就如同上面的箭头所示,由最后的数字向上写,因此可得到1101010的数字。这些数字的转换系统是非常重要的,因为计算机的加减乘除都是使用这些机制来处理。有兴趣的朋友可以再参考一下其他计算机概论的书籍中关于1的补码/2的补码等运算方式。
0.3.2 文字编码系统
既然计算机都只有记录0/1而已,甚至记录的数据都是使用byte/bit等单位来记录的,那么文字该如何记录啊?事实上文本文件也是被记录为0与1而已,而这个文件的内容要被取出来查阅时,必须要经过一个编码系统的处理才行。所谓的“编码系统”可以想成是一个“字码对照表”,它的概念如图0-16所示。
当我们要写入文件的文字数据时,该文字数据会由编码对照表将该文字转成数字后,再存入文件当中。同样,当我们要将文件内容的数据读出时,也会经过编码对照表将该数字转成对应的文字后再显示到屏幕上。现在你知道为何浏览器上面如果编码写错时会出现乱码了吗?这是因为编码对照表写错,导致对照的文字产生误差之故。
常用的英文编码表为ASCII系统,这个编码系统中,每个符号(英文、数字或符号等)都会占用1B的记录,因此总共会有28=256种变化。至于中文当中的编码系统,目前最常用的就是big5(简体则是gb2312)这个编码表了。每个中文字会占用2B,理论上最多可以有2的16次方=65536,即最多可达6万多个中文字。但是因为big5编码系统并非将所有的位都拿来运用成为对照,所以并非可显示这么多的中文字码的。目前big5仅定义了一万三千多个中文字,很多繁体中文利用big5是无法成功显示的,所以才会有造字程序之说。
big5码的中文编码对于某些数据库系统来说是很有问题的,某些字码例如“许、盖、功”等字,由于这几个字的内部编码会被误判为单/双引号,写入时还不成问题,在读出数据的对照表时,经常就会变成乱码。不只中文字,其他非英语系国家也常常会有这样的问题出现。
为了解决这个问题,由国际组织ISO/IEC制订了所谓的Unicode编码系统,即我们常常称呼的UTF8或统一码。因为这个编码系统打破了所有国家的不同编码,因此目前应用较多所以各位亲爱的朋友,记得将你的编码系统修订一下。