UTF-8 十六进制到 unicode 代码点(仅限数学)

mih*_*ins 3 math unicode hex utf-8

我们以该表为例,其中包含 Unicode 和 UTF-8 中的字符和十六进制编码。
\n有谁知道如何仅使用数学运算将 UTF-8 十六进制转换为 Unicode 代码点?
\n例如 让我们采取第一行。给定227129 130如何得到12354
\n有什么简单的方法可以仅使用数学运算来做到这一点吗?

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n
Unicode 代码点UTF-8查尔
30 42 (12354)e3 (227) 81 (129) 82 (130)\xe3\x81\x82
30 44 (12356)e3 (227) 81 (129) 84 (132)\xe3\x81\x84
30 46 (12358)e3 (227) 81 (129) 86 (134)\xe3\x81\x86
\n
\n

* 来源:https://www.utf8-chartable.de/unicode-utf8-table.pl ?start=12288&unicodeinhtml=hex

\n

mih*_*ins 6

该视频是完美的源代码(从 6:15 开始观看),但这里是其摘要和 golang 代码示例。我用字母标记从 UTF-8 字节中获取的位,希望它有意义。当您理解逻辑时,很容易应用按位运算符):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字节查尔UTF-8 字节Unicode 代码点解释
1 字节 (ASCII)1. 0xxx xxxx
0 100 01010x45
1. 0xxx xxxx
0100 0101 或U+0045
无需转换,UTF-8 和 unicode 代码点的值相同
2字节\xc3\x8a1. 110x xxxx
2. 10yy yyyy
110 0 0011 10 00 10100xC38A
0xxx xxyy yyyy
0000 1100 1010 或U+00CA
1. 第一个字节的前 5 位
2. 第二个字节的前 6 位
3字节\xe3\x81\x821. 1110 xxxx
2. 10yy yyyy
3. 10zz zzzz
1110 0011 10 00 0001 10 00 00100xE38182
xxxx yyyy yyzz zzzz
0011 0000 0100 0010 或U+3042
1. 第一个字节的前 4 位
2. 第二个字节的前 6 位
3. 第三个字节的前 6 位
4字节1. 1111 0xxx
2. 10yy yyyy
3. 10zz zzzz
4. 10ww wwww
1111 0 000 10 01 0000 10 00 0100 10 01 11110xF090_849F
000x xxyy yyyy zzzz zzww wwww
0000 0001 0000 0001 0001 1111 或U+1011F
1. 第 1 个字节的前 3 位
2. 第 2 个字节的前 6 位
3. 第 3 个字节的前 6 位
4. 第 4 个字节的前 6 位
\n

2 字节 UTF-8

\n
func get(byte1 byte, byte2 byte) {\n    int1 := uint16(byte1 & 0b_0001_1111) << 6\n    int2 := uint16(byte2 & 0b_0011_111)\n    return rune(int1 + int2)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

3 字节 UTF-8

\n
func get(byte1 byte, byte2 byte, byte3 byte) {\n    int1 := uint16(byte1 & 0b_0000_1111) << 12\n    int2 := uint16(byte2 & 0b_0011_111) << 6\n    int3 := uint16(byte3 & 0b_0011_111)\n    return rune(int1 + int2 + int3)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

4 字节 UTF-8

\n
func get(byte1 byte, byte2 byte, byte3 byt3, byte4 byte) {\n    int1 := uint(byte1 & 0b_0000_1111) << 18\n    int2 := uint(byte2 & 0b_0011_111) << 12\n    int3 := uint(byte3 & 0b_0011_111) << 6\n    int4 := uint(byte4 & 0b_0011_111)\n    return rune(int1 + int2 + int3 + int4)\n}\n
Run Code Online (Sandbox Code Playgroud)\n