网站首页 > 技术文章 正文
作者 | 石头哥 责编 | 八宝粥
来源 | 程序猿石头(id: tangleithu)
以一首五言绝句作为开篇,你知道背后说的是什么吗?
手持两把锟斤拷
口中疾呼烫烫烫
脚踏千朵屯屯屯
笑看万物锘锘锘
为何物?
在前不久石头哥的这篇文章中 —— 你可能也会掉进这个简单的 String 的坑,讲述了因字符编码问题而连续踩坑的经历,文中有一个神奇的字符 “”。
其实,这个 “” 真是无处不在,比如大名鼎鼎的微信:
再比如,封面图中,单价22元的“锟斤拷锟斤拷”,再随便百度一把:
要弄清这个问题,还得先从编码谈起。
因为在计算机的眼里,都是二进制,具体用哪些二进制数字表示哪个符号,这就是编码。不要把编码想象得太复杂,其实就是一个很简单的 mapping。
比如大家所熟知的 ASCII 编码,规定了 二进制的0100 0001,也就是十进制的65,代表的含义就是大写字母 A。
也是一种编码字符,就跟上面的 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)。
锟斤拷(可向右滑动)
现在,你知道了吗?
留个作业题:开篇的五言绝句,你知道另外的梗是来自哪里吗?欢迎留言讨论。
猜你喜欢
- 2025-03-19 从右至左查找数据,你在加班,同事用10种方法解决!
- 2025-03-19 Excel的使用技巧快来看看有哪些是你不知道的。
- 2025-03-19 EXCEL如何实现从右向左的逆向查询?INDEX和VLOOKUP都能实现
- 2025-03-19 本地dify借用大模型deepseek爬取网页信息
- 2025-03-19 新手通关Excel快捷键大全!(excel快捷键大全和excel 常用技巧整理)
- 2025-03-19 数字转整形骚操作(数字转换数字)
- 2025-03-19 分离字符串的操作(分离字符串的操作过程)
- 2025-03-19 VBA数组:打造Excel高效数据处理引擎
- 2025-03-19 Go 语言中不可不知的语法糖,使得代码更加简洁、高效
- 2025-03-19 vlookup你真的学会了吗?提取数据它比Ctrl+E更好用,就是太难了
- 04-29kali2021ping 外网不通
- 04-29我是如何用这3个小工具,助力小姐姐提升100%开发效率的
- 04-29注册下载啊
- 04-29Spring 中三种 BeanName 生成器!
- 04-29mysql学习9:创建数据库
- 04-29Linux之yum源详解
- 04-29夏日终曲/请以你的名字呼唤我/Call me by your name(无剧透)
- 04-29注释竟然还有特殊用途?一文解惑 //go:linkname 指令
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- sqlset (59)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)