计算机原理之编码
编码与加密
加密
什么是编码?他与加密有什么区别?
在密码学中,加密(英语:Encryption)是将明文信息改变为难以读取的密文内容,使之不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。
编码
那么什么是编码呢?
编码(Encoding)在认知上是解释传入的刺激的一种基本知觉的过程。技术上来说,这是一个复杂的、多阶段的转换过程,从较为客观的感觉输入(例如光、声)到主观上有意义的体验,是信息从一种形式或格式转换为另一种形式的过程。
解码,是编码的逆过程。
加密与编码的关系
从概念上可以看出,编码只是表现形式的转换,没有保密的作用,因为编码和解码的算法是公开的,只要知道是什么编码的内容,任何人都可以轻松地解码。从这个角度看加密也一种编码,只是解密算法是非公开的。
字符编码
字符编码(英语:Character encoding)、字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。
在计算机技术发展的早期,如ASCII(1963年)和EBCDIC(1964年)这样的字符集逐渐成为标准。但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。对于支持包括东亚CJK字符家族在内的写作系统的要求能支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。
为了弄懂计算机是怎么实现编码的,就要先理解计算机如何存储数据的。
数据在计算机中的存储
我们知道数据在计算机中是以二进制的形式存储的,那么有没有想过01这些数据是怎么存在计算机当中的呢?
第一步 如何存储0和1
不知道你们有没有听过一个东西,叫做——电容器。顾名思义,这是一种能容纳电荷的容器。与普通的电池不同的是,它的充电速度很快,并且因为不会转化为化学能所以电量流失的也很快。因此需要经常刷新。在我们的计算机中,CPU有一个参数是Hz,便是指每秒钟能充多少次电。数据在内存中以二进制的方式存储,事实上是通过对小电容器的充放电来完成的。
第二步 如何存储数字
当然是把数字转化成二进制啦
第三步 如何存储字符
既然能够存储0和1,那存储字符也就不是什么难事了吧。我们只需要把字符和二进制一一对应起来,然后责令计算机来记住它,就万事大吉了。ASCII美国信息交换标准码就是干这件事。
第四步 如何存储汉字
当然,早期的时候计算机并没有在中国兴起,所以中文并不能被计算机所识别,直到1980年GB2312(信息交换用汉字编码字符集)横空出世。功能与ASCII相似。当然,后来又有了GBK(国际标准扩展),我们暂且不提。
第五步 如何存储所有字符
照葫芦画瓢,将所有的字符进行编号,所以有了Unicode字符集。但是这里有一个问题,虽然它可以存储世界上所有的字符,但是如果你的编码是000000000000001,它是不会自动给你简化成1的。由此直接导致了所有的文字存储代价都会翻倍,而这样的代价,是很多人都不愿意看见的。
第六步 如何将Unicode存到计算机里
这里稍微解释一下最后一行,第一块的两个11是指后边有两串跟着,紧接着的10是指两串开头两个标志位是10。上边的Unicode编码中截取后两个字节放到下边utf-8中除标志位之外的地方,也就是说,除了第一块开头的1110,第二块和第三块开头的10,我们有4+6+6=16位来依次存储上边的8+8=16位字符串。
如你所见,这就是UTF-8,一种编码方式。它采用了变长存储的形式来表示Unicode字符集。