今天是春节之后第一天上班,
锟哥在这里先祝大家,开工大吉,身体健康!
同时,锟哥也给大家准备了开工红包,在我们的公众号后台回复 开工大吉 领取红包,先到先得哦!
回归今天的主题,我们先来看一张图:
是不是非常非常的熟悉,特别是在 5-6 年之前!
你向某人发的 表白小作文.txt,他迟迟不回你信,别怀疑,TA 或许打开看到的就是这样的内容,哈哈!
今天我们就要来讨论下:
为啥当年你迟迟没收到回信,呸....
讨论下,这乱码是咋造成的!
字符编码基础知识
要破译这悬案,首先得知道些字符编码的基础知识。
因为字符编码,对于计算机技术来说,是他必不可少的基石。
为啥呢?
因为计算机他们计算、交流都使用的是 010101 这种二进制,
我们人类不可能也用二进制去和计算机交流呗,
如果那样的话,你现在看到的这篇文章应该全是 01 而不是现在的这种 文字符号 。
所以在文字和计算机之间就必须存在一种转换(翻译)的角色,
就像两个不同国家的人交流,
如果双方都不懂对方语言,就需要一个 翻译 来为双方翻译。
这个 翻译 在计算机里面就是 字符集 。
最开始计算机只收录了 128 个字符,这个字符集叫 ASCII 码。
以下我截了表的部分,来自百度百科。
你可以看到,大写字母 A 对应的数字是 65 。
怎么运作的呢?
计算机里面计算、存储这些依旧使用 0101 二进制,但是当需要和人类交互的时候,就需要按照字符集翻译成属于我们的文字。
来看一句 Go 语言代码:
代码语言:javascript复制fmt.Printf("%c n",65)
// 执行结果
A
这句代码就是把 65 这个十进制,根据字符集给翻译成了大写字母 A 。
更多的字符集
ASCII 码 表只收录了 128 个字符,随着互联网技术的发展,很明显是不够用的。
不同国家有自己的文字也就意味着有各自的字符集,比如我国就有GB2312,韩国有Euc-kr,
但这样一来大家都各自搞一套,不乱套了么!
于是 Unicode 就诞生了,他把全球所有的符号都给收录了进来,都给了他们一个唯一的编码。
貌似一下就天下太平了。
但是 Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字严
的 Unicode 是十六进制数4E25
,转换成二进制数足足有15位(100111000100101
),也就是说,这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
但是我们知道英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0
,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍。
这该怎么办?
Unicode 解决了翻译,但是没解决传输和存储问题!
于是 UTF-8 来了!
UTF-8 就是在互联网上,是使用最广的一种 Unicode 的 实现方式之一,敲重点,是实现方式,同时是之一。
其他还有 UTF-16,UTF-32 但我们一般不用。
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
具体咋实现变长的,规则是啥,我这里截一张阮一峰大神的文章里的描述:
图片来自:https://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
经过这两个牛逼技术的组合,你此刻才能看到屏幕上的文字!
因为我们数据在传输的时候,并不是使用的文字符号,而是被翻译成了 UTF-8 码的方式进行传输的。
那为啥会出现乱码呢?
当 UTF-8 并没大一统的时候,各家的字符集都不一样。
你文档里面的内容使用的是 GB2312 编码 ,但你使用 ASCII编码 去翻译,那肯定就乱码了哇。
不过现在一般还是不太容易出现了,因为各大厂家,各大开发者,都基本默认使用 UTF-8 了。
所以乱码出现的概率就比较小了。