1 Go 语言字符编码基础
我们首先要知道
1)Go 语言的代码是由 Unicode 字符组成的,它们都必须由 Unicode 编码规范中的 UTF-8 编码格式进行编码并存储。
2)Unicode 编码规范中的编码格式定义的是:字符与字节序列之间的转换方式。其中的 UTF- 8 是一种可变宽的编码方案。
3)Go 语言中的一个string类型值会由若干个 Unicode 字符组成,每个 Unicode 字符都可 以由一个rune类型的值来承载。
2.下面举例说明
package main
import "fmt"
func main() {
var s string = "hello 中国!"
fmt.Println(len(s)) //13
}
上面简单的二行代码,使用len计算字符串的长度 ,打印结果是13,按照我们习惯应该是9个长度,go语言len函数则是计算字节的长度,我们都知道一个中文是3个字节,英文就是一个字节,因此len函数是计算字节的长度。如果我们向计算字符的长度怎么办呢,go语言另外个包,我们使用
fmt.Println(utf8.RuneCountInString(s)) // 9
上面打印就符合我们的习惯了 ,获取了正确的字符长度。
3.接下来我们来思考下字符传的循环操作,下面的显示什么
func main() {
var s string = "hello 中国!"
fmt.Println(len(s)) //13
for i := 0; i < len(s); i++ {
fmt.Printf("序号%d,字节:%c", i, s[i])
fmt.Println()
}
}
这个打印的结果:
序号0,字节:h
序号1,字节:e
序号2,字节:l
序号3,字节:l
序号4,字节:o
序号5,字节:
序号6,字节:ä
序号7,字节:¸
序号8,字节:
序号9,字节:å
序号10,字节:
序号11,字节:½
序号12,字节:!
思考下为什么中文会显示乱码,英文可以正常显示,我们不难发现,使用的是 循环字节,一个中文是3个字节,上面的循环肯定会出现问题的,接下来要正常显示,我们使用for ...range 循环即可,for ...range 是对Unicode码一个个循环,避免了中文的乱码
func main() {
var s string = "hello 中国!"
for i,v := range s{
fmt.Printf("序号%d,字节编码:%c",i,v)
fmt.Println()
}
}
结果:
序号0,字节编码:h
序号1,字节编码:e
序号2,字节编码:l
序号3,字节编码:l
序号4,字节编码:o
序号5,字节编码:
序号6,字节编码:中
序号9,字节编码:国
序号12,字节编码:!
这样的循环就对了,很明显可以看出中文一个字符占3个字节长度。但是还有一个问题,我们可以看出啊 循环的序号不是顺序增加的,原因还是中文的问题,接下来我们来解决这个问题。
4.上面的说到的问题也很简单,我们思考下,只有把字符串变成rune数组,不管是中文还是英文都可以用一个Unicode来实现。然后再对rune数组循环,那么序号肯定正确的了,上面的代码稍微改下即可,代码如下:
func main() {
var s string = "hello 中国!"
for i,v := range []rune(s){
fmt.Printf("序号%d,字节编码:%c",i,v)
fmt.Println()
}
}
结果如下:
序号0,字节编码:h
序号1,字节编码:e
序号2,字节编码:l
序号3,字节编码:l
序号4,字节编码:o
序号5,字节编码:
序号6,字节编码:中
序号7,字节编码:国
序号8,字节编码:!
至此:go语言对字符串的循环都说完了,看后我相信你对字符串循环有了深刻的理解。