Go语言中有单个字符和ascii码值直接转换的方法吗?
// 附录1
golang的字符称为rune,等价于C中的char,可直接与整数转换。
var c rune='a'
var i int =98
i1:=int(c)
fmt.Println("'a' convert to",i1)
c1:=rune(i)
fmt.Println("98 convert to",string(c1))
//string to rune
for _, char := range []rune("世界你好") {
fmt.Println(string(char))
}
字节遍历,字符遍历
https://play.golang.org/p/DeZcCN9aHXo
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "充气nb1"
// 字节遍历
for i := 0; i < len(s); i++ {
fmt.Println(s[i])
}
// 字符遍历
fmt.Println("len:", len(s))
for i, k := range s {
fmt.Println(i, k)
}
// 字节遍历2
for i, w := 0, 0; i < len(s); i += w {
runeValue, width := utf8.DecodeRuneInString(s[i:])
fmt.Printf("%#U starts at byte position %d
", runeValue, i)
w = width
}
}
总结
-
golang的string是以UTF-8编码的,而UTF-8是一种1-4字节的可变长字符集,每个字符可用1-4字节 来表示
-
使用下标方式s[i]访问字符串s,s[i]是UTF-8编码后的一个字节(uint8),即按字节遍历
-
使用for i,v := range s 方式访问s,i是字符串下标编号,v是对应的字符值(int32=rune),即按字符遍历
-
使用fmt.Printf打印时,%c占位符打印的是字符,%+v占位符打印的是这个类型自身,如fmt.Printf("%+v",s[i])打印的就是字节一个十进制的无符号整数s[i]
-
如果希望以随机方式访问字符串s的每个字符,可以先转为[]rune数组,再以下标访问
参考资料
其他
package main
import (
"fmt"
)
func main() {
s := "测试"
fmt.Println(s)
fmt.Println(len(s))
fmt.Println(s[0])
for _, v := range s {
fmt.Println(v)
}
}