mih*_*ins 3 math unicode hex utf-8
我们以该表为例,其中包含 Unicode 和 UTF-8 中的字符和十六进制编码。
\n有谁知道如何仅使用数学运算将 UTF-8 十六进制转换为 Unicode 代码点?
\n例如 让我们采取第一行。给定227
,129
130
如何得到12354
?
\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 |
* 来源:https://www.utf8-chartable.de/unicode-utf8-table.pl ?start=12288&unicodeinhtml=hex
\n该视频是完美的源代码(从 6:15 开始观看),但这里是其摘要和 golang 代码示例。我用字母标记从 UTF-8 字节中获取的位,希望它有意义。当您理解逻辑时,很容易应用按位运算符):
\n字节 | 查尔 | UTF-8 字节 | Unicode 代码点 | 解释 |
---|---|---|---|---|
1 字节 (ASCII) | 乙 | 1. 0xxx xxxx 0 100 0101或 0x45 | 1. 0xxx xxxx 0100 0101 或 U+0045 | 无需转换,UTF-8 和 unicode 代码点的值相同 |
2字节 | \xc3\x8a | 1. 110x xxxx 2. 10yy yyyy 110 0 0011 10 00 1010或 0xC38A | 0xxx xxyy yyyy 0000 1100 1010 或 U+00CA | 1. 第一个字节的前 5 位 2. 第二个字节的前 6 位 |
3字节 | \xe3\x81\x82 | 1. 1110 xxxx 2. 10yy yyyy 3. 10zz zzzz 1110 0011 10 00 0001 10 00 0010或 0xE38182 | 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 1111或 0xF090_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 位 |
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)\nfunc 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)\nfunc 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