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

作者 | 石头哥  责编 | 八宝粥

来源 | 程序猿石头(id: tangleithu)

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

手持两把锟斤拷

口中疾呼烫烫烫

脚踏千朵屯屯屯

笑看万物锘锘锘

� 为何物?

在前不久石头哥的这篇文章中 —— 你可能也会掉进这个简单的 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)。

锟斤拷(可向右滑动)

现在,你知道了吗?

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



☞女朋友的一个建议,这位程序员创立仅 551 天公司就被 10 亿美元收购了☞抽成 30% 的苹果税是良心价?谷歌也学“坏”了☞“面向对象就是一个错误!”☞回溯 Rust 2020:正在成为最受欢迎的编程语言
### NRF24L01模块连接失败解决方案 当遇到NRF24L01模块连接失败的情况时,可以按照以下几个方面来排查和解决问题。 #### 1. 检查硬件连接 确保SPI接口连线无误,特别是MOSI, MISO, SCK, CE, CSN这些引脚要正确连接到微控制器上。任何松动或错误的连接都可能导致通信异常[^1]。 #### 2. 验证电源供应 确认给NRF24L01供电的是稳定干净的3.3V电压源。不稳定的电源可能会引起工作不稳定甚至完全失效。建议使用有良好滤波效果的稳压器为设备提供电力支持。 #### 3. 天线调试 对于天线部分,应该保证其处于开放空间内并无遮挡物影响信号传输;另外还需注意所选频段是否受到干扰。必要时可尝试更换不同类型的天线或将现有天线调整至更优位置以改善性能表现。 #### 4. 参数配置审查 仔细核对初始化过程中设置的各项参数(如频道号、地址长度等),确保发送端与接收端之间保持一致。可以通过读取寄存器状态字节的方式验证当前设定值是否符合预期要求。 ```cpp // 示例代码片段:检查并打印出一些重要的配置项 void checkConfig() { uint8_t configReg = readRegister(CONFIG); Serial.print("CONFIG Register Value: "); Serial.println(configReg, HEX); // 更多类似的检查... } ``` #### 5. 软件层面测试 编写简单的程序来进行基本功能检测,比如循环往复地向指定目标发送固定模式的数据包,并观察对方能否正常接收到。这有助于快速定位问题所在——究竟是硬件还是软件出了差错。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值