我想知道如何从字符串中获取Unicode字符。比如,如果字符串是“你好”,那么如何获取第一个字符“你”?
我从另一个地方得到了一种方法:
var str = "你好"
runes := []rune(str)
fmt.Println(string(runes[0]))
它确实有效。 但我还有一些问题:
是否有其他方法可以做到这一点?
为什么在Go语言中,
str[0]
不能从字符串中获取Unicode字符,而是获取了字节数据?
首先,您可能需要阅读https://blog.golang.org/strings,它将解答您部分问题。
在Go中,字符串可以包含任意字节。当您写下str[i]时,结果是一个字节,索引始终是字节数。
大多数情况下,字符串以UTF-8编码。您可以有多种方法来处理字符串中的UTF-8编码。
例如,您可以使用for...range语句按rune逐个迭代字符串。
var first rune
for _,c := range str {
first = c
break
}
// first now contains the first rune of the string
您还可以利用unicode/utf8软件包。例如:
r, size := utf8.DecodeRuneInString(str)
// r contains the first rune of the string
// size is the size of the rune in bytes
如果字符串是用UTF-8编码的,那么没有直接访问字符串中第n个rune的方法,因为rune(以字节为单位)的大小不是固定的。如果您需要此功能,可以轻松编写自己的辅助函数来实现它(使用for...range或unicode/utf8包)。utf8string
包:package main
import "golang.org/x/exp/utf8string"
func main() {
s := utf8string.NewString("ÄÅàâäåçèéêëìîïü")
// example 1
r := s.At(1)
println(r == 'Å')
// example 2
t := s.Slice(1, 3)
println(t == "Åà")
}
你可以这样做:
func main() {
str := "cat"
var s rune
for i, c := range str {
if i == 2 {
s = c
}
}
}
s现在等于a
i == 1
会得到 "a" 吗? - John Gibb
for range
或首先将其转换为[]rune
,这两种方法都需要 O(n) 的时间。这正确吗? - ibic