示例:“大红圈”表情符号 ???? 可以使用 HTML 显示🔴
但是,如果我创建一个包含相同表情符号的文本文件,使用 UTF-8 编码保存该文件,然后使用十六进制编辑器检查它,我可以看到表情符号是用这四个字节表示的:F0 9F 94 B4
。这是一个非常不同的数字。
两种表示形式之间的转换公式是什么?如何从 0x1F534 派生出 0xF09F94B4,反之亦然?
1f534
指 Unicode 代码点。用二进制表示是:
00000001 11110101 00110100
如果你看一下UTF-8 位分布 http://www.unicode.org/versions/Unicode9.0.0/ch03.pdf#page=54您可以看到这些位如何插入到代码点的 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)