1 分钟带你认识从 "?" 到 "锟斤拷"

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

 [[378294]]

? 为何物?

在前不久石头哥的这篇文章中 —— 你可能也会掉进这个简单的 String 的坑,讲述了因字符编码问题而连续踩坑的经历,文中有一个神奇的字符 “?”。

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

微信中的?

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

随处可见的?

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

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

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

ASCII 编码

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

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

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

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

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

??

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

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

“锟斤拷”在此

惊不惊喜意不意外……

其实是因为,? 用 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)。

锟斤拷(可向右滑动)

现在,你知道了吗?

留个作业题:开篇的五言绝句,你知道另外的梗是来自哪里吗?

 

责任编辑:武晓燕 来源: 程序猿石头
相关推荐

2021-10-18 08:41:06

锟斤拷ASCII编码

2019-09-06 09:37:06

乱码字符编码Unicode

2022-11-03 11:31:43

结构分析法监测

2017-03-14 19:18:56

AndroidGradle实践

2010-09-29 15:15:15

DHCP中继

2022-05-09 08:35:43

面试产品互联网

2021-08-03 09:07:39

GolangGrpc服务

2015-11-23 17:34:33

秒借

2016-11-28 16:23:23

戴尔

2009-05-31 15:15:50

思科路由器模块

2020-02-04 15:00:25

大白话认识JVM

2017-09-07 12:56:24

Linux系统结构

2011-03-10 12:52:43

路由器

2021-03-10 09:52:38

开发技能架构

2011-05-07 14:05:30

投影屏幕投影机

2023-04-17 18:50:03

2017-04-11 09:38:11

2017-01-11 13:40:32

华为云

2015-03-16 16:01:40

Web前端前端工程师Web

2024-05-22 09:45:49

点赞
收藏

51CTO技术栈公众号