示例:“大红圈”表情符号可以使用🔴
以HTML格式显示但是如果我创建一个文本文件,其中包含相同的表情符号,请使用UTF-8编码保存文件,然后检查它使用十六进制编辑器,我可以看到表情符号用这四个字节表示:F0 9F 94 B4
。这是一个非常不同的数字。
在两种表示形式之间进行转换的公式是什么?如何从0x1F534派生0xF09F94B4,反之亦然?
答案 0 :(得分:1)
1f534
指的是Unicode代码点。二进制文件是:
00000001 11110101 00110100
如果您查看UTF-8 Bit Distribution,您可以看到这些位如何插入代码点的UTF-8编码。
Scalar Value First Byte Second Byte Third Byte Fourth Byte
00000000 0xxxxxxx 0xxxxxxx
00000yyy yyxxxxxx 110yyyyy 10xxxxxx
zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx
000uuuuu zzzzyyyy yyxxxxxx 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx
所以你得到了:
000uuuuu zzzzyyyy yyxxxxxx as
00000001 11110101 00110100
将这些位插入:
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx =
11110000 10011111 10010100 10110100
以十六进制表示F0 9F 94 B4
。
另一方面,从UTF-8到代码点,你检查第一个字节的最高有效位,看看有多少字节被使用(这应该从上表中清楚),然后剔除相关的把它们放在一起。
奖金艺术线条:
000uuuuu zzzzyyyy yyxxxxxx as
00000001 11110101 00110100
│││││ ││││││││ │││││││└────────┐
│││││ ││││││││ ││││││└────────┐│
│││││ ││││││││ │││││└────────┐││
│││││ ││││││││ ││││└────────┐│││
│││││ ││││││││ │││└────────┐││││
│││││ ││││││││ ││└────────┐│││││
│││││ ││││││││ │└─────┐ ││││││
│││││ ││││││││ └─────┐│ ││││││
│││││ │││││││└──────┐││ ││││││
│││││ ││││││└──────┐│││ ││││││
│││││ │││││└──────┐││││ ││││││
│││││ ││││└──────┐│││││ ││││││
│││││ │││└───┐ ││││││ ││││││
│││││ ││└───┐│ ││││││ ││││││
│││││ │└───┐││ ││││││ ││││││
│││││ └───┐│││ ││││││ ││││││
││││└────┐││││ ││││││ ││││││
│││└────┐│││││ ││││││ ││││││
││└─┐ ││││││ ││││││ ││││││
│└─┐│ ││││││ ││││││ ││││││
└─┐││ ││││││ ││││││ ││││││
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx =
11110000 10011111 10010100 10110100