• 两个"�"="锟斤拷"?


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

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

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

    手持两把锟斤拷

    口中疾呼烫烫烫

    脚踏千朵屯屯屯

    笑看万物锘锘锘

    � 为何物?

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

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

    微信中的�

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

    随处可见的�

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

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

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

    ASCII 编码

     也是一种编码字符,就跟上面的 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)

    <0xEFBF,0xBDEF,0xBFBD

    现在,你知道了吗?

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

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

  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/leitang/p/14438892.html
Copyright © 2020-2023  润新知