当前位置:博客首页 > 备忘录 > 正文

一张图快速记住ASCII、GB2312、GBK、Unicode、UTF-8这些编码之间的关系

作者: Jarvan 分类: 备忘录 发布时间: 2019-07-04 09:32 百度已收录

一开始,是美国首先出台了ASCII编码(读音:/ˈæski/),统一规定了常用符号用哪些二进制数来表示。

因为英文字母、数字再加上其他常用符号,也就100来个,因此使用7个比特位(最多表示128位)就够用了,所以一个字节中被剩下的那个比特位就被默认为0。

再后来呢,这套编码表传入欧洲,才发现这128位不够用啊。比如说法语字母上面还有注音符,这个怎么区分?得!把最后一个比特位也编进来吧。因此欧洲普遍使用一个全字节(8个比特位)进行编码,最多可表示256位,至此,一个字节就用满了!

但是前面的状态0-127位可以共用,但从状态128到255这一段的解释就完全乱套了,比如135在法语,希伯来语,俄语编码中完全是不同的符号。

当计算机漂洋过海来到中国后,问题又来了,计算机完全不认识博大精深的中文,当然也没法显示中文;而且一个字节的256位都被占满了,但中国有10万多个汉字,256位连塞牙缝都不够啊。

为了沟通的便利,Unicode(万国码)应运而生,这套编码表将世界上所有的符号都纳入其中。每个符号都有一个独一无二的编码,现在Unicode可以容纳100多万个符号,所有语言都可以互通,一个网页上也可以显示多国语言。

看起来皆大欢喜。但是!问题又来了,自从英文世界吃上了Unicode这口大锅饭,为迁就一些占用字节比较多的语言,英文也要跟着占两个字节。比如要存储A,原本00010001就可以了,现在偏得用两个字节:00000000 00010001才行,这样对计算机空间存储是种极大的浪费!

基于这个痛点,科学家们又提出了天才的想法:UTF-8(8-bit Unicode Transformation Format)。它是一种针对Unicode的可变长度字符编码,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,而当字符在ASCII码的范围时,就用一个字节表示,所以UTF-8还可以兼容ASCII编码。

Unicode与UTF-8这种暧昧的关系一言以蔽之:Unicode是内存编码的规范,而UTF-8是如何保存和传输Unicode的手段。

将上述这段波澜壮阔、分久必合的编码史浓缩成一个表格表示,就是:

ASCII、GB2312、GBK、Unicode、UTF-8关系(图)

编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()

分隔符还挺常见的,我们在上网的时候,不是会有网址嘛?你经常会看到网址里面有好多的%,它们也是分隔符,替换了Python中的\x。比如像下面这个:

# python utf-8编码后的清平乐
\xe6\xb8\x85\xe5\xb9\xb3\xe4\xb9\x90
# 百度网址中的清平乐
https://www.baidu.com/s?wd=%e6%b8%85%e5%b9%b3%e4%b9%90


它的意思就是在百度里面,搜索“清平乐”,使用的是UTF-8编码。上面的UTF-8编码结果和这一串网址的差异,其实它们除了分隔符以外,是一模一样的。

其他: Windows系统里,常用\来表示绝对路径,/来表示相对路径

发表评论