如何在十六进制 NCR 和 UTF-8 代码单元之间进行转换?
How can I convert between hex NCRs and UTF-8 code units?
示例:"large red circle" 表情符号可以使用 🔴
在 HTML 中显示,但是如果我创建一个包含相同表情符号的文本文件,请使用 UTF-8 保存文件编码,然后用十六进制编辑器检查它,我可以看到表情符号是用这四个字节表示的:F0 9F 94 B4
。这是一个非常不同的数字。
两种表示法之间的转换公式是什么?如何从 0x1F534 导出 0xF09F94B4,反之亦然?
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 到代码点,您检查第一个字节的最高有效位以查看使用了多少字节(这应该从上面的 table 中清楚) ,然后把相关的位挑出来放在一起。
奖金线稿:
000uuuuu zzzzyyyy yyxxxxxx as
00000001 11110101 00110100
│││││ ││││││││ │││││││└────────┐
│││││ ││││││││ ││││││└────────┐│
│││││ ││││││││ │││││└────────┐││
│││││ ││││││││ ││││└────────┐│││
│││││ ││││││││ │││└────────┐││││
│││││ ││││││││ ││└────────┐│││││
│││││ ││││││││ │└─────┐ ││││││
│││││ ││││││││ └─────┐│ ││││││
│││││ │││││││└──────┐││ ││││││
│││││ ││││││└──────┐│││ ││││││
│││││ │││││└──────┐││││ ││││││
│││││ ││││└──────┐│││││ ││││││
│││││ │││└───┐ ││││││ ││││││
│││││ ││└───┐│ ││││││ ││││││
│││││ │└───┐││ ││││││ ││││││
│││││ └───┐│││ ││││││ ││││││
││││└────┐││││ ││││││ ││││││
│││└────┐│││││ ││││││ ││││││
││└─┐ ││││││ ││││││ ││││││
│└─┐│ ││││││ ││││││ ││││││
└─┐││ ││││││ ││││││ ││││││
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx =
11110000 10011111 10010100 10110100
示例:"large red circle" 表情符号可以使用 🔴
在 HTML 中显示,但是如果我创建一个包含相同表情符号的文本文件,请使用 UTF-8 保存文件编码,然后用十六进制编辑器检查它,我可以看到表情符号是用这四个字节表示的:F0 9F 94 B4
。这是一个非常不同的数字。
两种表示法之间的转换公式是什么?如何从 0x1F534 导出 0xF09F94B4,反之亦然?
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 到代码点,您检查第一个字节的最高有效位以查看使用了多少字节(这应该从上面的 table 中清楚) ,然后把相关的位挑出来放在一起。
奖金线稿:
000uuuuu zzzzyyyy yyxxxxxx as
00000001 11110101 00110100
│││││ ││││││││ │││││││└────────┐
│││││ ││││││││ ││││││└────────┐│
│││││ ││││││││ │││││└────────┐││
│││││ ││││││││ ││││└────────┐│││
│││││ ││││││││ │││└────────┐││││
│││││ ││││││││ ││└────────┐│││││
│││││ ││││││││ │└─────┐ ││││││
│││││ ││││││││ └─────┐│ ││││││
│││││ │││││││└──────┐││ ││││││
│││││ ││││││└──────┐│││ ││││││
│││││ │││││└──────┐││││ ││││││
│││││ ││││└──────┐│││││ ││││││
│││││ │││└───┐ ││││││ ││││││
│││││ ││└───┐│ ││││││ ││││││
│││││ │└───┐││ ││││││ ││││││
│││││ └───┐│││ ││││││ ││││││
││││└────┐││││ ││││││ ││││││
│││└────┐│││││ ││││││ ││││││
││└─┐ ││││││ ││││││ ││││││
│└─┐│ ││││││ ││││││ ││││││
└─┐││ ││││││ ││││││ ││││││
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx =
11110000 10011111 10010100 10110100