6

回想起毕业刚工作时,大白差点被"锟斤拷"搞死

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzI1MzYzMTI2Ng%3D%3D&%3Bmid=2247485782&%3Bidx=1&%3Bsn=6fdb15b9920e16ead35ac352783b0f83
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
2my22uy.gif!mobile

欢迎关注 “程序猿石头 ——

一个毕业于清华的普通打工仔

以一首 五言绝句作为开篇,你知道背后说的是什么吗?

手持两把 锟斤拷

口中疾呼 烫烫烫

脚踏千朵 屯屯屯

笑看万物 锘锘锘

� 为何物?

其实,这个 “ ” 真是无处不在,比如大名鼎鼎的微信:

qEnqueV.png!mobile 微信中的�

再比如,封面图中,单价22元的“锟斤拷 锟斤拷 ”,再随便百度一把:

j6bmIv.png!mobile 随处可见的�

要弄清这个问题,还得先从编码谈起。

因为在计算机的眼里,都是二进制,具体用哪些二进制数字表示哪个符号,这就是编码。不要把编码想象得太复杂,其实就是一个很简单的 mapping。

比如大家所熟知的 ASCII 编码,规定了 二进制的 0100 0001 ,也就是十进制的 65 ,代表的含义就是大写字母  A

VrIrUba.png!mobile ASCII 编码

也是一种编码字符,就跟上面的  A 一样一样的,它是 UNICODE 编码方式中的一个特殊的字符,也就是 0xFFFD(65533),语义是一个占位符,用来表达这套编码系统中未知的,自己不认识的东西。

比如上篇文章中的实验截图的,红色部分圈出来的对应的字符,UTF-8 编码都不认识,所以按照 UNICODE 的定义,我就只好用统一的一个占位符 ——  0xFFFD(65533) 来表示。

3INrM3z.png!mobile

为什么会出现“锟斤拷”?

我们接着上篇的例子来看, 如下图所示,仍然从 “程序猿石头” 对应二进制编码截取部分:

Vfm67nr.png!mobile

如上图所示,第 18 行的字节数组 new byte[] {-25, -119, -25, -116}UTF-8 恰好都不认识,因此只能用占位符替换。

2qmUvm6.png!mobile ��

这种情况,在编码转换过程中确实也比较常见,如果双方没沟通清楚,确实很容易出现互相不认识的情况。

QRnyUje.png!mobile

在中文系统中,常见的字符编码是 GBK,这个时候,因为大家没提前商量清楚,我就默认按照 GBK 给你编码看看。

rAfqeeJ.png!mobile “锟斤拷”在此

惊不惊喜意不意外……

其实是因为, 用  UTF-8 编码后变成了  0xEFBFBD (就是上面的字节数组  [-17, -65, -67] ),两个连起来就是  0xEFBFBDEFBFBD ,也就是上面的字节数组 [-17, -65, -67, -17, -65, -67]

而 GBK 编码依然采用双字节编码方案,因此上面的 6 字节 0xEFBFBDEFBFBD ,就被拆成了 3 个 2 字节字符即  0xEFBF, 0xBDEF, 0xBFBD 对应 GBK 编码里面就是:锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。

V7BRjaQ.png!mobile

j6NJjuf.png!mobile

bEjYraz.png!mobile

锟斤拷(可向右滑动

社畜大白 

现字节跳动Low T Coder,分享优质技术文章, 欢迎添加大白微信,交流、指导、吹牛、扯淡,快来吧xdm!

R3I7JrZ.jpg!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK