先来看一个简单的例子
func main() {
str := "你好guoke"
fmt.Println("字符串长度为:", len(str))
for i:=0; i<len(str); i++{
fmt.Println("第",i+1,"个字符为:",str[i:i+1])
}
}
输出的结果为:
字符串长度为: 11
第 1 个字符为: �
第 2 个字符为: �
第 3 个字符为: �
第 4 个字符为: �
第 5 个字符为: �
第 6 个字符为: �
第 7 个字符为: g
第 8 个字符为: u
第 9 个字符为: o
第 10 个字符为: k
第 11 个字符为: e
从上面例子中可以看出,string是以byte数组形式存储的,而一个utf8格式的中文占3个byte.要得到正确的中文字符的长度和分割,可以使用rune
数组来拆分. rune类型是int32的别名,一个rune可以表示一个中文字符,go也提供了rune数组自动拆分string中文字符的方法rt := []rune(str)
.
我们再把上面例子修改一下:
func main() {
str := "你好guoke"
rt := []rune(str)
fmt.Println("字符串长度为:", len(rt))
for i:=0; i<len(rt); i++{
fmt.Println("第",i+1,"个字符为:",string(rt[i]))
}
}
得到的输出结果为:
字符串长度为: 7
第 1 个字符为: 你
第 2 个字符为: 好
第 3 个字符为: g
第 4 个字符为: u
第 5 个字符为: o
第 6 个字符为: k
第 7 个字符为: e
这样就能比较好的处理中文了,而且不会出现乱码的情况.