示例:
func main() {
byteSlice := []byte{226, 140, 152, 97, 98, 99}
fmt.Println(string(byteSlice))
}
打印输出:
⌘abc
在引擎盖下,Go怎么知道前三个字节226, 140, 152
应该被分组为一个uint32符文:⌘
,而剩下的字节应该分别转换为三个单独的符文:a
、b
和c
?
通过将UTF-8编码解码为UTF-32。
一个简单的问题是查看每个八位位组的前导位,屏蔽前哨位,并将数据位与位偏移和逐位OR组合。
代码点↔UTF-8转换
第一个代码点 | 最后一个代码点 | 字节1字节2 | 字节3 | 字节4 | |
---|---|---|---|---|---|
U+0000 | U+007F | 0xxxxxxx | |||
U+0080 | U+07FF | 110xxxxxx | |||
U+0800 | U+FFFF | 110xxxx | 10xxxxxx | ||
U+10000 | U+10FFFF | 11110xxx | 10xxxxxx | 10xxxx