让我们以Unicode和UTF-8格式的字符和HEX编码为例。
有人知道如何将UTF-8十六进制转换为Unicode代码点仅使用数学操作吗?
。我们从第一行开始。给定227
,129
,130
,如何得到12354
?
是否有简单的方法来做到这一点,只使用数学运算?
Unicode码位 | UTF-8 | Char | 30 42 (12354) | e3 (227) 81 (129) 82 (130) | あ |
---|---|---|
30 44 (12356) | e3 (227) 81 (129) 84 (132) | い |
30 46 (12358) | e3 (227) 81 (129) 86 (134) | う |
这个视频是完美的来源(观看从6:15),但这里是它的摘要和golang代码示例。我用字母标记从UTF-8字节中取出的位,希望这是有意义的。当你理解了逻辑,就很容易应用位运算符):
Bytes | Char | UTF-8 Bytes | Unicode码位 | 说明 | 字节(ASCII) | E | 1。0xxx xxxx 0100 0101或 0x45 | 1。0xxx xxxx 0100 0101或 U+0045 | 不需要转换,在UTF-8和unicode码点 | 中相同的值
---|---|---|---|---|
2字节 | E | 1。110 x xxxx 2。10yy yyyy 1100 00111000 1010或 0xC38A | 0xxx xxyy yyyy 0000 1100 1010或 U+00CA | 1。第一个字节 2的前5位。第二个字节的前6位 |
3-byte | 1110 xxxx 2。10 yy yyyy 3。10zz zzzz 111000111000 00011000 0010或 0xE38182 | xxxx yyyy yyzz zzzz 0011 0000 0100 0010或 U+3042 | 1。第一个字节 2的前4位。第二个字节 3的前6位。第3个字节的前6位 | |
4字节 | 𐄟 | 1。1111 0 xxx 2。10 yy yyyy 3。10 zz睡眠 4。10www 1111 00001001 00001000 01001001 1111或 0xF090_849F | 000x xxyy yyyy zzzz zzww www 0000 0001 0000 0001 0001 1111或 U+1011F | 1。第一个字节 2的前3位。第二个字节 3的前6位。第3个字节 4的前6位。第4个字节的前6位 |