编码浅谈
为什么要熟悉编码的本质?
- 深入理解计算机软硬件知识
- 深入理解计算机背后的语言
一、先来理解编码
-
广义的理解:编码就是交流,目的是给事物赋予名称,要和加密区分开。
-
常见的例子:我们使用的语言,文字,以及手语,盲文都是编码,还有经典的莫斯编码
莫斯编码便记图 -
意义:计算机处理声音,图像,视频等等都需要各自的编码
-
原则:将简单短促的编码分配给使用频率较高的字母
-
神奇的规律:两个不同的事物,只要经过适当组合,就可以表示所有类型的信息
(这就是计算机的灵魂所在,复杂的电路和逻辑背后就是永恒且简洁的二进制)
二、致敬伟大的二进制
-
奇妙的二进制:任何信息都能转化成两种或多种可能性的选择,因此就可以用二进制表示所有信息。
奇妙的二进制 -
怎么做到的:一个比特就代表两种情况,是或非。为了表示更多的情况就需要更多的比特,所能表示的情况数等于2的整数次幂
以编码为例,如果要给26个字母编码的话,用5个比特就够了 - 大思路:计算机中所有信息都是以比特流的形式存在
-
字节:为了方便表示比特流,引入了字节的概念,请牢记1个字节(byte)=8个比特(bit)蟹蟹。另外由于4位二进制可以很方便的用一位16进制表示,因此我们一般就用两位16进制表示一个字节
比如抓到的数据包就是将字符按ACSII编码然后以16进制表示,图中两位16进制表示一个字节 -
进制转换:我们日常生活中使用的是以10为基数的数字系统,而理解二进制时要将2看作基数,逢2进位
以2为基数的数字系统
简单进制转换
三、我们是怎么使用编码的
如果你是一个生活在2003年的程序员,却不了解字符、字符集、编码和Unicode这些基础知识。那你可要小心了,要是被我抓到你,我会让你在潜水艇里剥六个月洋葱来惩罚你。
---------Joel Spolsky
首先编码定义了两件事:
- 字节是怎么分组的,如8 bits或16 bits一组,这也被称作编码单元。
-
编码单元和字符之间的映射关系。例如,在ASCII码中,十进制65映射到字母A上
附上ASCII最好查的一张表,表示编码怎么映射到字符上
其次我们来看一下编码的历史
最早出场的就是 ASCII(美国信息交换标准码),其编码长度为7位,最多可表示128个编码,而一个字符要有8个比特,这样编码的话就会剩下一个比特位没有用,也就是从128到255的编码并没有被制定ASCII标准的人所规定,因此其它国家的人趁这个机会开始使用128到255范围内的编码来表达自己语言中的字符。例如,144在阿拉伯人的ASCII码中是گ,而在俄罗斯的ASCII码中是ђ。即使在美国,对于未使用区域也有各种各样的利用。IBM PC就出现了“OEM 字体”或”扩展ASCII码”,为用户提供漂亮的图形文字来绘制文本框并支持一些欧洲字符,例如英镑(£)符号。
这样一来ASCII码的问题在于尽管所有人都在0-127号字符的使用上达成了一致,但对于128-255号字符却有很多很多不同的解释,出于统一的目的,Unicode诞生了。
最后来看看Unicode的世界
-
正确理解:Unicode就像一个电话本,标记着字符和数字之间的映射关系它对支持字符的数量没有限制,也不要求字符必须占两个、三个或者其它任意数量的字节。
-
流行的编码方案:utf-8和utf-16
-
utf-8:在UTF-8中,0-127号的字符用1个字节来表示,使用和US-ASCII相同的编码(对ASCII的向后兼容)。只有128号及以上的字符才用2个,3个或者4个字节来表示,比如汉字一般会用3个字节来表示。因此,UTF-8被称作可变长度编码。