如何在十六进制 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