如何在十六进制NCR和UTF-8代码单元之间进行转换?

时间:2017-07-13 16:36:19

标签: utf-8 utf

示例:“大红圈”表情符号可以使用🔴以HTML格式显示但是如果我创建一个文本文件,其中包含相同的表情符号,请使用UTF-8编码保存文件,然后检查它使用十六进制编辑器,我可以看到表情符号用这四个字节表示:F0 9F 94 B4。这是一个非常不同的数字。

在两种表示形式之间进行转换的公式是什么?如何从0x1F534派生0xF09F94B4,反之亦然?

1 个答案:

答案 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