go中的字符串是utf8编码的
根据golang官方博客https://blog.golang.org/strings的原文:
翻译整理过来其实也就是两点:
- go中的代码总是用utf8编码,并且字符串能够存储任何字节。
- 没有经过字节级别的转义,那么字符串是一个标准的utf8序列。
\u0081
Unicode到UTF-8的编码方对照表:
Unicode编码(十六进制) | UTF-8 字节流(二进制) |
000000-00007F | 0xxxxxxx |
000080-0007FF | 110xxxxx 10xxxxxx |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
\u0081100000010x81
110xxxxx 10xxxxxx
10000001
00010000001
0001000000100000100010
00000100010110xxxxx 10xxxxxx11000010 10000001
我们通过go对二进制转为整型:
综上:当用字符转字节时输出的是字符本身的整型值,当用字符串转字节切片时,实际上是输出的是utf8的字节切片序列(go中的字符串存储的就是utf8字节切片)。此时,我们回顾一下最开始的问题,就会发现输出是完全符合预期的。
go中的rune
rune
由上可知用rune切片去转字符串时,它是直接将每个字符转为对应的unicode。
我们通过下面的代码模拟字符串转为[]rune切片和[]rune切片转为字符串的过程:
字符串转为rune切片:
utf8.DecodeRune
rune切片转为字符串:
utf8.EncodeRune
rune
欢迎访问我的公众号文章,对go字符串编码有一个较为全面的剖析