为何会出现乱码

76 阅读1分钟

1、下面这段go的循环代码,为何出现乱码? 我们探究一下

package main

import "fmt"

func main() {
   str := "hello world你"
   // 对字符串的遍历
   for i := 0; i < len(str); i++ {
      fmt.Printf("%c ", str[i])
   }
}

输出:

h e l l o   w o r l d ä ½

2、%c是什么意思,代表字符还是字节 翻阅一下官方文档:

image.png

那说明对应的是字符。

既然是字符,为何不能把汉字"你"输出出来呢?

那就说明str[i]此时对应的值并不是

推导出,问题出在str[i]上面,i的值是由len(str)控制的。

我们需要能够输出,自然是把当成了一个整体。那么我们期待的len(str)的值应该是12。

但是实际上len(str)的值是多少?

package main

import "fmt"

func main() {
   str := "hello world你"

   fmt.Println(len(str))
}

输出

14

为什么是14呢?我们看一下len(str)这个方法的注释:

image.png

len()中参数为string类型的时候,返回的是字节数。一个汉字是3个字节。所以我们查看str[i]的时候就相当于把这个汉字进行了拆分。因此所对应的字符自然就不是原先的汉字了。而是被拆分的字节里面的值对应的字符。