两个"�"="锟斤拷"?
关于作者:程序猿石头(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+,现在分享给大家。点击原文获取。
两个"�"="锟斤拷"?的更多相关文章
- 漫话:如何给女朋友解释什么是"锟斤拷"?
漫话:如何给女朋友解释什么是"锟斤拷"? 周末女朋友出去逛街了,我自己一个人在家看综艺节目,突然,女朋友给我打来电话. 过了一会,女朋友回来了,她拿出手机,给我看了她在超市拍的 ...
- tesseract编译各种 “锟斤拷” 等中文乱码 编译失败问题
编译tesseract - ocr时 各种不通过 也很疑惑,完全按照官方指导来的啊 首先以为是vs的编码问题,随切换选项-切换Unicode或多编码字符集,但仍无效. 定位到乱码的文件,用notepa ...
- python中烦人的锟斤拷(\xef\xbf\xbd)
首先要知道\xef\xbf\xbd是啥东西 >>> u'\uFFFD'.encode('utf-8') '\xef\xbf\xbd' 由此我们可以知道\xef\xbf\xbd是utf ...
- 对拷 使用scp命令在两台linux上对拷文件或者文件夹
以前一直是在服务器上tar打包压缩,下载到本地电脑上,再上传到另外一台服务器上,再解压. 其实使用scp命令就可以直接对拷文件或者文件夹了. scp就是secure copy,是用来进行远程文件拷贝的 ...
- 关于项目中的一些经验:封装activity、service的基类,封装数据对象
经验一,将几个页面公用的数据,和方法进行封装,形成一个baseActivity的类: package com.ctbri.weather.control; import java.util.Array ...
- Python2.7字符编码详解
目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3.1 ASCII(初创) 1.3. ...
- python习题20190130
#encoding=utf-8 ''' 一家商场在降价促销.如果购买金额50-100元(包含50元和100元)之间,会给10%的折扣,如果购买金额大于100元会给20%折扣.编写一程序,询问购买价格, ...
- 转1:Python字符编码详解
Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...
- 一周精彩内容分享(第 1 期):"世纪逼空大战"
这里记录过去一周,我看到的值得分享的东西. 一方面是整理记录一下自己一周的学习,另一方面也是期待自己有更多的输出,有更多的价值. 周刊开源(Github:wmyskxz/weekly),欢迎提交 is ...
随机推荐
- python----类,面向对象(封装、继承、多态)(属性,方法)
什么是对象? 对象是内存中专门用来存储数据的一块区域 对象中可以存放各种数据(数字.代码等) 对象由三部分组成(1,对象标识(id)2,对象类型(type)3,对象的值(value)) 面向对象编程是 ...
- vb.net和C#两兄弟谁的封装性更好?
引言: 虽然没怎样接触过vb.net,但是大概对于vb6还是比较了解的.前者是从后者基础上发展而来的.后来接触了C#编程语言,起初没有太关心她和vb.net有啥不同的地方,话说都是面向对象的,而且都是 ...
- springboot基础配置-->Properties配置
Spring Boot项目中的application.properties配置文件一共可以出现在如下4个位置: 项目根目录下的config文件夹中. 项目根目录下. classpath下的config ...
- 2019牛客暑期多校训练营(第九场)J Symmetrical Painting (思维)
传送门 大体思路就是:枚举所有可能的水平对称线,计算面积更新答案. 所有可能的水平对称线:\(L_i,R_i,{L_i+R_i\over 2}\) 计算面积:将所有可能的水平对称线从小到大排序,然后依 ...
- 前n项余数个数和
一:O(n) 计算贡献:前n项中,能被i(1~n)整除的数的个数为(n/i)个,,也就是 i 给前n项中(n/i)个数做了余数 #include<iostream> using names ...
- js实现一棵树的生长
参考链接:https://blog.csdn.net/u010298576/article/details/76609244 HTML网页源码: 1 <!DOCTYPE html> 2 & ...
- Java——方法及构造方法、intellij IDEA中的一些快捷键
intellij IDEA中的一些快捷键: 一.方法基础 给你一个两个int类型的数相加的例子: 这个例子说明了 public static void main(String[] args) {}相当 ...
- hdu5375 Gray code
Problem Description The reflected binary code, also known as Gray code after Frank Gray, is a binary ...
- poj3260 The Fewest Coins
Description Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he a ...
- Find a multiple POJ - 2356 容斥原理(鸠巢原理)
1 /* 2 这道题用到了鸠巢原理又名容斥原理,我的参考链接:https://blog.csdn.net/guoyangfan_/article/details/102559097 3 4 题意: 5 ...