由于go使用变长的UTF-8编码机制进行字符串编码,所以当我们串中有中文等特殊字符时,需要按照字符的长度进行取出,否则会出现乱码,处理方式有以下两种。
1 使用unicode包下的DecodeRuneInString函数
这种方式的自定义程度较高,使用的方式也比较直观。
import (
"fmt"
"unicode/utf8"
)
func divideStr(s string) {
for i := 0; i < len(s); {
r, size := utf8.DecodeRuneInString(s[i:])
// 编写需要对字符进行的操作
fmt.Printf("%c\n", r)
// ====
i += size
}
}
举个例子,如果需要将字符串中的每个文字分割并保存到一个数组中,则可以使用如下的实现方式。
package main
import (
"fmt"
"unicode/utf8"
)
func divideStr(s string) []rune {
var chs []rune
for i := 0; i < len(s); {
r, size := utf8.DecodeRuneInString(s[i:])
// 编写需要对字符进行的操作
chs = append(chs, r)
// ====
i += size
}
return chs
}
func main() {
var s = "live in valley 针不戳"
var res = divideStr(s)
for i := range len(res) {
fmt.Printf("%c ", res[i])
}
}
2 使用go自带range
这种方式也可以实现相同的效果,而且代码比较简短,缺点是只能按次序遍历。
package main
import (
"fmt"
)
func divideStr(s string) []rune {
var chs []rune
for _, r := range s {
chs = append(chs, r)
}
return chs
}
func main() {
var s = "live in valley 针不戳"
var res = divideStr(s)
for i := range len(res) {
fmt.Printf("%c ", res[i])
}
}
当然,上面的divideStr做的工作可以用rune的构造器来代替,简洁高效。
package main
import (
"fmt"
)
func main() {
var s = "live in valley 针不戳"
var res = []rune(s)
for i := range len(res) {
fmt.Printf("%c ", res[i])
}
}