你有没有想过我们现在的编码是有何而来的?

这周看了一本非常好的书《密码了不起》,通过非常有趣的方式了解了编码的由来。

来看看我们熟悉的编码格式都是怎么来的吧!

摩尔斯电码

18世纪,科学家发现可以用静电实现远距离通信,但是电信号只有“连通”和“断开”两种状态,那么要如何通过他们传递信息呢?

于是科学家发明了“摩尔斯电码”这个方案。

方法

用“点·”和“划-”的不同组合方式来表示我们的字符。

比如:“·-”表示A,“-···”表示B

问题

但是,这个方法的问题是,每个字符所对应的摩尔斯电码长度不同,很容易因为分割位置不同产生多种解码结果,产生歧义。

波特码

于是,当然就有更先进的编码方式来取代了,那就是“波特码”

方法

固定使用5个“0”和“1”的组合表示一个字符

比如:10000表示A,00110表示B

到这里,我们就可以看到计算机的影子了:

计算机只能识别“0”和“1”,不论什么文件都会转化成“0”和“1”在电脑中储存、处理。

问题

问题又来了,5个为一组的“0”和“1”,总共有2^5^(32)个不同的组合方法,它们能够表示的字符太少了

ASCII码

为了让波特码表示更多字符,波特对波特码进行了优化,成为了后来的“ASCII码”

方法

固定使用7个“0”和“1”的组合表示一个字符

问题

能表示的字符数量还是不够,只能表示英语,无法表示其他国家的语言字符

各国编码标准

各个国家开始制定了支持自己语言字符的编码标准。

比如:Latin/Greek编码用8个“0”和“1”的组合表示一个字符,中文编码标准用16个“0”和“1”的组合表示一个字符…

问题

各国用自己的标准,必定会产生全球信息交流的障碍,不同国家间流传的文本可能会在另一方变成乱码。

Unicode&UTF

于是,在互联网时代,一个全球统一的编码标准当然就来了“Unicode”

方法

规定使用8个“0”和“1”表示英语字母,16个表示汉字,24个表示emoji。

问题

如何知道什么时候8个为一组,什么时候16个为一组呢?

解决

科学家进一步提出了统一编码变换格式(UTF)的标准来解决。

UTF标准包含UTF-8, UTF-16, UTF-32三种格式。


*Base16, 32, 64

这是用于将计算机中的信息(显示不出来的“0”和“1”)转换成人类能看见的字符的方法。

比如:将一个图片转换成一串字符,用于复制粘贴。

我们经常在浏览器地址栏看到结尾是一串乱码,实际那就是用Base64url表示的。

方法

  • Base16:将“0”和“1”每4个分为一组,总共可以用2^4^=16个字符来表示。
  • Base32:将“0”和“1”每4个分为一组,总共可以用2^5^=32个字符来表示。
  • Base64:将“0”和“1”每4个分为一组,总共可以用2^6^=64个字符来表示。

总结

这些知识总结于《密码了不起》讲编码的一部分,但编码并不是密码,编码只需掌握规律格式就可以轻松解出。

这本书中主要科普了密码学这个有趣的方向,大家可以在放松时偷闲一读,非常有意思。