【Unicode 字符】你看到的 ≠ 你想的

435 阅读2分钟

Surface Chars

s := []rune("1️⃣,😄") // 按照以往的经验,utf8 能存下大部分符号表情

嘿这不就是三个 utf8 字符嘛,求字符个数肯定是 3 嘛。

fmt.Println(len(s)) // 5

138_ab900c171e071bc11a586b6df3b08946.gif What the hell is this?

到这里脑子没有嗡嗡的朋友,请你离开这里,去更远的远方,别回头。

Really Chars

好家伙,打印看看到底是什么东西脏了我的眼

for _, v := range s {
    // 字符 Unicode  二进制
    // 1   U+0031   110001
    //️     U+FE0F   1111111000001111
    // ⃣   U+20E3   10000011100011
    // ,   U+002C   101100
    // 😄  U+1F604  11111011000000100

   fmt.Printf("%c %U %b\n", v, v)
}

可以看到打印出第一个符号 1️⃣ 是由于三个 unicode 字符

[U+0031, U+FE0F, U+20E3] 组成的一个复合符号,其实每个字符都是有自己的意义的,只不过当三个字符在一起的时候会产生奇妙的变化。

(这个符号你在 IDE 上打出来,然后左右移动箭头,会发现要移动三次才能离开)

开始学习(内卷)

U+FE0F 三个字符中中间这个甚是诡异,从这个开始分析找点(学习资料

  • 变体选择器 知乎上的解释 形象的例子

  • 键帽序列 键帽序列是将数字0-9,*和#在VS-16的基础上通过U+20E3字符转换为键帽的样式。 例如:(U+0031 U+FE0F U+20E3) 的 emoji 就是 1️⃣

    差不多的比喻:
    
    妹子 A: `U+0023` 我是一个基础的 emoji 表情。
    渣男 B: `U+FEOF` 对上面的妹子 A 说,不,你不是普通的表情,你很特别,起码在我心中。
    某物品 C: `U+20E3` 带上它,你会多一层保护。
    

到这里脑子还在嗡嗡的朋友,请你离开这里,去更远的远方,别回头。