Go语言中Rune与UTF-8字节二进制表示不符的疑问
关于Go中rune与UTF-8编码的疑问解答
rune不是UTF-8字节的二进制拼接,它本质是Go语言对int32的别名,用来存储Unicode码点的原始值——那些UTF-8字节里的前缀是编码时的格式标记,解码后会被完全剥离,剩下的才是rune存储的内容。
结合你的代码例子拆解来看:
- "中"对应的Unicode码点是
U+4E2D,转换成二进制就是100111000101101,这正是你输出里rune的值。 - UTF-8是一种把Unicode码点转换成可变长度字节序列的编码规则:
- 对于
U+4E2D这种属于3字节范围(U+0800 ~ U+FFFF)的码点,UTF-8会用「1110xxxx 10xxxxxx 10xxxxxx」的格式编码:- 第一个字节前缀
1110,后面拼接码点的高4位0100→ 得到11100100 - 第二个字节前缀
10,后面拼接码点的中间6位111000→ 得到10111000 - 第三个字节前缀
10,后面拼接码点的低6位101101→ 得到10101101
- 第一个字节前缀
- 对于
- 当你执行
[]rune(s)[0]时,Go会自动对字符串的UTF-8字节做解码:去掉每个字节的格式前缀,把剩下的有效位拼接起来,还原出原始的Unicode码点值,也就是你看到的rune结果。
简单说,UTF-8字节是码点的"编码传输形式",而rune是码点的"原始存储形式",二者是编码和解码的关系,不是直接拼接。
内容的提问来源于stack exchange,提问作者Frank Lu
相关产品推荐
相关产品推荐

