关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader。欢迎关注,交流和指导!

本文首发于微信公众号,原文链接,转载请全文保留。

以一首七言绝句作为开篇:

手持两把锟斤拷

口中疾呼烫烫烫

脚踏千朵屯屯屯

笑看万物锘锘锘

� 为何物?

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

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

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

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

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

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

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

比如上篇文章中的实验截图的,红色部分圈出来的对应的字符,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)

<,,

现在,你知道了吗?

留个作业题:开篇的七言绝句,你知道另外的梗是来自哪里吗?欢迎留言讨论。

最近看到一份来自阿里巴巴开源的学习资料,涵盖了大前端、客户端、服务端、算法等多个技术领域,全书内容⻚数1600+,现在分享给大家。点击原文获取

两个"�"="锟斤拷"?的更多相关文章

  1. 漫话:如何给女朋友解释什么是"锟斤拷"?

    漫话:如何给女朋友解释什么是"锟斤拷"? ​ 周末女朋友出去逛街了,我自己一个人在家看综艺节目,突然,女朋友给我打来电话. 过了一会,女朋友回来了,她拿出手机,给我看了她在超市拍的 ...

  2. tesseract编译各种 “锟斤拷” 等中文乱码 编译失败问题

    编译tesseract - ocr时 各种不通过 也很疑惑,完全按照官方指导来的啊 首先以为是vs的编码问题,随切换选项-切换Unicode或多编码字符集,但仍无效. 定位到乱码的文件,用notepa ...

  3. python中烦人的锟斤拷(\xef\xbf\xbd)

    首先要知道\xef\xbf\xbd是啥东西 >>> u'\uFFFD'.encode('utf-8') '\xef\xbf\xbd' 由此我们可以知道\xef\xbf\xbd是utf ...

  4. 对拷 使用scp命令在两台linux上对拷文件或者文件夹

    以前一直是在服务器上tar打包压缩,下载到本地电脑上,再上传到另外一台服务器上,再解压. 其实使用scp命令就可以直接对拷文件或者文件夹了. scp就是secure copy,是用来进行远程文件拷贝的 ...

  5. 关于项目中的一些经验:封装activity、service的基类,封装数据对象

    经验一,将几个页面公用的数据,和方法进行封装,形成一个baseActivity的类: package com.ctbri.weather.control; import java.util.Array ...

  6. Python2.7字符编码详解

    目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3.1 ASCII(初创) 1.3. ...

  7. python习题20190130

    #encoding=utf-8 ''' 一家商场在降价促销.如果购买金额50-100元(包含50元和100元)之间,会给10%的折扣,如果购买金额大于100元会给20%折扣.编写一程序,询问购买价格, ...

  8. 转1:Python字符编码详解

    Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...

  9. 一周精彩内容分享(第 1 期):"世纪逼空大战"

    这里记录过去一周,我看到的值得分享的东西. 一方面是整理记录一下自己一周的学习,另一方面也是期待自己有更多的输出,有更多的价值. 周刊开源(Github:wmyskxz/weekly),欢迎提交 is ...

随机推荐

  1. vb.net和C#两兄弟谁的封装性更好?

    引言: 虽然没怎样接触过vb.net,但是大概对于vb6还是比较了解的.前者是从后者基础上发展而来的.后来接触了C#编程语言,起初没有太关心她和vb.net有啥不同的地方,话说都是面向对象的,而且都是 ...

  2. Selenium爬虫实践(踩坑记录)之ajax请求抓包、浏览器退出

    上一篇: 使用Selenium截取网页上的图片 前言 最近在搞公司内部系统,累的一批,需要从另一个内部系统导出数据存到数据库做分析,有大量的数据采集工作,又没办法去直接拿到那个系统的接口,太难了,只能 ...

  3. C语言实现2048小游戏

    目录 2048 一.设计思路 1.游戏规则 2.思路 二.代码实现 1.存储结构 2.初始化游戏数据 3.向左合并 4.其他方向合并 5.产生新的方块 6.源代码 7.实例演示 三.问题 2048 一 ...

  4. B 明码

    B 明码 :汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛. 16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字节就 ...

  5. POJ-3208 Apocalypse Someday (数位DP)

    只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \( ...

  6. 2017-2018 ACM-ICPC Latin American Regional Programming Contest PART (11/13)

    $$2017-2018\ ACM-ICPC\ Latin\ American\ Regional\ Programming\ Contest$$ \(A.Arranging\ tiles\) \(B. ...

  7. Network POJ - 3694 无向图找桥

    题意: 给你一个无向图,你需要找出来其中有几个桥 桥: 1.存在重边必定不为桥 2.low[v]>dfn[u] 代码: //题意很清晰 //就是这个需要先找出来原无向图中的桥个数,然后在判断添加 ...

  8. Codeforces Round #656 (Div. 3) B. Restore the Permutation by Merger (模拟)

    题意:有两个完全相同的排列,将其中一个的元素按相对顺序插入另外一个排列中,给你操作完的排列,求原排列. 题解:感觉看看样例就能直接写了啊,直接遍历,用桶存数字个数,如果桶为空,直接输出即可. 代码: ...

  9. PowerShell随笔2---初始命令

    PowerShell便捷之处 PowerShell中兼容运行cmd的命令,比如 ipconfig.ping命令等 PowerShell的命令更友好,可读性更强.比如停止一个服务 CMD命令:sc st ...

  10. ELK Stack 介绍 & Logstash 日志收集

    ELK Stack 组成 Software Description Function E:Elasticsearch Java 程序 存储,查询日志 L:Logstash Java 程序 收集.过滤日 ...