go中的字符串是utf8编码的

根据golang官方博客https://blog.golang.org/strings的原文:

翻译整理过来其实也就是两点:

  1. ​go中的代码总是用utf8编码,并且字符串能够存储任何字节。
  2. 没有经过字节级别的转义,那么字符串是一个标准的utf8序列。
\u0081

Unicode到UTF-8的编码方对照表:

​Unicode编码(十六进制)UTF-8 字节流(二进制)
000000-00007F0xxxxxxx
000080-0007FF110xxxxx 10xxxxxx
000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF11110xxx 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字符串编码有一个较为全面的剖析