编码浅谈

2017-12-15  本文已影响0人  楠昭

为什么要熟悉编码的本质?

  1. 深入理解计算机软硬件知识
  2. 深入理解计算机背后的语言

一、先来理解编码

  1. 广义的理解:编码就是交流,目的是给事物赋予名称,要和加密区分开。

  2. 常见的例子:我们使用的语言,文字,以及手语,盲文都是编码,还有经典的莫斯编码


    莫斯编码便记图
  3. 意义:计算机处理声音,图像,视频等等都需要各自的编码

  4. 原则:将简单短促的编码分配给使用频率较高的字母

  5. 神奇的规律:两个不同的事物,只要经过适当组合,就可以表示所有类型的信息
    (这就是计算机的灵魂所在,复杂的电路和逻辑背后就是永恒且简洁的二进制)

二、致敬伟大的二进制

  1. 奇妙的二进制:任何信息都能转化成两种或多种可能性的选择,因此就可以用二进制表示所有信息。


    奇妙的二进制
  2. 怎么做到的:一个比特就代表两种情况,是或非。为了表示更多的情况就需要更多的比特,所能表示的情况数等于2的整数次幂


    以编码为例,如果要给26个字母编码的话,用5个比特就够了
  3. 大思路:计算机中所有信息都是以比特流的形式存在
  4. 字节:为了方便表示比特流,引入了字节的概念,请牢记1个字节(byte)=8个比特(bit)蟹蟹。另外由于4位二进制可以很方便的用一位16进制表示,因此我们一般就用两位16进制表示一个字节


    比如抓到的数据包就是将字符按ACSII编码然后以16进制表示,图中两位16进制表示一个字节
  5. 进制转换:我们日常生活中使用的是以10为基数的数字系统,而理解二进制时要将2看作基数,逢2进位


    以2为基数的数字系统
    简单进制转换

三、我们是怎么使用编码的

如果你是一个生活在2003年的程序员,却不了解字符、字符集、编码和Unicode这些基础知识。那你可要小心了,要是被我抓到你,我会让你在潜水艇里剥六个月洋葱来惩罚你。
---------Joel Spolsky

首先编码定义了两件事:

  1. 字节是怎么分组的,如8 bits或16 bits一组,这也被称作编码单元。
  2. 编码单元和字符之间的映射关系。例如,在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的世界

  1. 正确理解:Unicode就像一个电话本,标记着字符和数字之间的映射关系它对支持字符的数量没有限制,也不要求字符必须占两个、三个或者其它任意数量的字节。

  2. 流行的编码方案:utf-8和utf-16

  3. utf-8:在UTF-8中,0-127号的字符用1个字节来表示,使用和US-ASCII相同的编码(对ASCII的向后兼容)。只有128号及以上的字符才用2个,3个或者4个字节来表示,比如汉字一般会用3个字节来表示。因此,UTF-8被称作可变长度编码。

上一篇下一篇

猜你喜欢

热点阅读