数据表示方式-LINUX

事实上我们的计算机只认识0与1,记录的数据也只能记录0与1而已,所以计算机常用的数据是二进制的。但是我们人类常用的数值运算是十进制,文字方面则是非常多的语言,常用的语言就有英文、中文(又分繁体与简体中文)、日文等。那么计算机如何记录与显示这些数值/文字呢?就得要通过一系列的转换才可以啦!下面我们就来谈谈值与文字的编码系统。

数字系统

早期的计算机使用的是利用通电与否的特性的真空管,如果通电就是1,没有通电就是0,后来沿用至今,我们称这种只有0/1的环境为二进位制,英文称为binary的哩。所谓的十进位指的是逢十进一位,因此在个位数归为零而十位数写成1。所以所谓的二进位,就是逢二就前进一位的意思。

那二进位怎么用呢?我们先以十进位来解释好了。如果以十进位来说,3456的意义为:

3456 = 3x103 + 4x102 + 5x101 + 6x100

特别注意:『任何数值的零次方为1』所以100的结果就是1罗。 同样的,将这个原理带入二进位的环境中,我们来解释一下1101010的数值转为十进位的话,结果如下:

1101010=1x26 + 1x25 + 0x24 + 1x23 + 0x22 + 1x21 + 0x20

= 64 + 32 + 0x16 + 8 + 0x4 + 2 + 0x1 = 106

这样你了解二进位的意义了吗?二进位是计算机基础中的基础喔!了解了二进位后,八进位、十六进位就依此类推啦!那么知道二进位转成十进位后,那如果有十进位数值转为二进位的环境时,该如何计算?刚刚是乘法,现在则是除法就对了!我们同样的使用十进位的106转成二进位来测试一下好了:

二进位转十进位

图3.1.1、十进位转二进位的方法

最后的写法就如同上面的红色箭头,由最后的数字向上写,因此可得到1101010的数字罗!这些数字的转换系统是非常重要的,因为计算机的加减乘除都是使用这些机制来处理的!有兴趣的朋友可以再参考一下其他计算计概论的书籍中,关於1的补数/2的补数等运算方式喔!


文字编码系统

既然计算机都只有记录0/1而已,甚至记录的数据都是使用byte/bit等单位来记录的,那么文字该如何记录啊?事实上文字档案也是被记录为0与1而已,而这个档案的内容要被取出来查阅时,必须要经过一个编码系统的处理才行。所谓的『编码系统』可以想成是一个『字码对照表』,他的概念有点像底下的图示:

编码表

图3.2.1、数据参考编码表的示意图

当我们要写入档案的文字数据时,该文字数据会由编码对照表将该文字转成数字后,再存入档案当中。同样的,当我们要将档案内容的数据读出时,也会经过编码对照表将该数字转成对应的文字后,再显示到萤幕上。现在你知道为何浏览器上面如果编码写错时,会出现乱码了吗?这是因为编码对照表写错,导致对照的文字产生误差之故啦!

常用的英文编码表为ASCII系统,这个编码系统中,每个符号(英文、数字或符号等)都会占用1bytes的记录,因此总共会有28=256种变化。至於中文字当中的编码系统目前最常用的就是big5这个编码表了。每个中文字会占用2bytes,理论上最多可以有216=65536,亦即最多可达6万多个中文字。但是因为big5编码系统并非将所有的位都拿来运用成为对照,所以并非可达这么多的中文字码的。目前big5仅定义了一万三千多个中文字,很多中文利用big5是无法成功显示的~所以才会有造字程序说。

big5码的中文字编码对於某些数据库系统来说是很有问题的,某些字码例如『许、盖、功』等字,由於这几个字的内部编码会被误判为单/双引号,在写入还不成问题,在读出数据的对照表时,常常就会变成乱码。不只中文字,其他非英语系国家也常常会有这样的问题出现啊!

为了解决这个问题,由国际组织ISO/IEC跳出来制订了所谓的Unicode编码系统,我们常常称呼的UTF8或万国码的编码就是这个咚咚。因为这个编码系统打破了所有国家的不同编码,因此目前网际网络社会大多朝向这个编码系统在走,所以各位亲爱的朋友啊,记得将你的编码系统修订一下喔!