我们先来看一张图:

20220209115425_pe4rjw.png

是不是非常非常的熟悉,特别是在 5-6 年之前!

你向某人发的 表白小作文.txt,他迟迟不回你信,别怀疑,TA 或许打开看到的就是这样的内容,哈哈!

今天我们就要来讨论下:

为啥当年你迟迟没收到回信,呸…

讨论下,这乱码是咋造成的!

字符编码基础知识

要破译这悬案,首先得知道些字符编码的基础知识。

因为字符编码,对于计算机技术来说,是他必不可少的基石。

为啥呢?

因为计算机他们计算、交流都使用的是 010101 这种二进制,

我们人类不可能也用二进制去和计算机交流呗,

如果那样的话,你现在看到的这篇文章应该全是 01 而不是现在的这种 文字符号

所以在文字和计算机之间就必须存在一种转换(翻译)的角色,

就像两个不同国家的人交流,

如果双方都不懂对方语言,就需要一个 翻译 来为双方翻译。

这个 翻译 在计算机里面就是 字符集

最开始计算机只收录了 128 个字符,这个字符集叫 ASCII 码

以下我截了表的部分,来自百度百科。

20220209115439_pru8pw.png

20220209115448_83xtdv.png

你可以看到,大写字母 A 对应的数字是 65 。

怎么运作的呢?

计算机里面计算、存储这些依旧使用 0101 二进制,但是当需要和人类交互的时候,就需要按照字符集翻译成属于我们的文字。

来看一句 Go 语言代码:

这句代码就是把 65 这个十进制,根据字符集给翻译成了大写字母 A 。

更多的字符集

ASCII 码 表只收录了 128 个字符,随着互联网技术的发展,很明显是不够用的。

不同国家有自己的文字也就意味着有各自的字符集,比如我国就有GB2312,韩国有Euc-kr,

但这样一来大家都各自搞一套,不乱套了么!

于是 Unicode 就诞生了,他把全球所有的符号都给收录了进来,都给了他们一个唯一的编码。

貌似一下就天下太平了。

但是 Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

严4E25100111000100101
0

这该怎么办?

Unicode 解决了翻译,但是没解决传输和存储问题!

于是 UTF-8 来了!

UTF-8 就是在互联网上,是使用最广的一种 Unicode 的 实现方式之一,敲重点,是实现方式,同时是之一

其他还有 UTF-16,UTF-32 但我们一般不用。

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

具体咋实现变长的,规则是啥,我这里截一张阮一峰大神的文章里的描述:

20220209115504_mcjv83.png

图片来自:https://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

经过这两个牛逼技术的组合,你此刻才能看到屏幕上的文字!

因为我们数据在传输的时候,并不是使用的文字符号,而是被翻译成了 UTF-8 码的方式进行传输的。

那为啥会出现乱码呢?

当 UTF-8 并没大一统的时候,各家的字符集都不一样。

你文档里面的内容使用的是 GB2312 编码 ,但你使用 ASCII编码 去翻译,那肯定就乱码了哇。

不过现在一般还是不太容易出现了,因为各大厂家,各大开发者,都基本默认使用 UTF-8 了。

所以乱码出现的概率就比较小了。