2 回答

TA贡献1752条经验 获得超4个赞
Go 字符串在概念上是只读字节数组的只读切片。未指定该字节数组的编码,但字符串常量将是 UTF-8 并且在其他字符串中使用 UTF-8 是推荐的方法。
Go 提供了方便的函数来访问 UTF-8 作为 unicode 代码点(或 go-speak 中的符文)。字符串上的范围循环将为您进行 utf8 解码。转换为 []rune 将为您提供 rune 切片,即按顺序排列的 unicode 代码点。这些好东西只适用于 UTF-8 编码的字符串/字节数组。我强烈建议在内部使用 UTF-8。
一个例子:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
println("non-range loop - bytes")
for i := 0; i < len(input); i++ {
fmt.Printf("%d %d %[2]x\n", i, input[i])
}
println("range-loop - runes")
for idx, r := range input {
fmt.Printf("%d %d %[2]c\n", idx, r)
}
println("converted to rune slice")
rs := []rune(input)
fmt.Printf("%#v\n", rs)
}
输入:X é X
non-range loop - bytes
0 88 58
1 32 20
2 195 c3
3 169 a9
4 32 20
5 88 58
6 10 a
range-loop - runes
0 88 X
1 32
2 233 é
4 32
5 88 X
6 10
converted to rune slice
[]int32{88, 32, 233, 32, 88, 10}

TA贡献1852条经验 获得超1个赞
Unicode 和 utf8 没有可比性。字符串可以是 unicode 和 utf8。通过阅读Go 中的字符串、字节、符文和字符,我学到了很多关于这些的东西。
要回答你的问题,
您可以使用包中的DecodeRuneInStringunicode/utf8。
s := "é"
rune, _ := utf8.DecodeRuneInString(s)
fmt.Printf("%x", rune)
什么DecodeRuneInString(s)是,它返回第一个 utf8 编码字符(符文)s以及该字符宽度(以字节为单位)。因此,如果您想在字符串中获取每个符文的 unicode 代码点,请按照以下步骤操作。这是链接文档中给出的示例,仅稍作修改。
str := "Hello, 世界"
for len(str) > 0 {
r, size := utf8.DecodeRuneInString(str)
fmt.Printf("%x %v\n", r, size)
str = str[size:]
}
在操场上试试。
或者,正如 Juergen 指出的那样,您可以在字符串上使用范围循环来获取字符串中包含的符文。
str := "Hello, 世界"
for _, rune := range(str) {
fmt.Printf("%x \n", rune)
}
- 2 回答
- 0 关注
- 196 浏览
添加回答
举报