我正在尝试在控制台中使用 bufio 读取用户输入。文本可以包含一些特殊字符(é、à、♫、╬、...)。
代码如下:
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
如果我键入例如“é”,ReadString 会将其读取为“c3 a9”而不是“00e9”。如何读取 Unicode 而不是 UTF-8 中的文本输入?我需要将此值用作哈希表键。
谢谢
最佳答案
Go 字符串在概念上是只读字节数组的只读 slice 。未指定该字节数组的编码,但字符串常量将为 UTF-8,并且在其他字符串中使用 UTF-8 是推荐的方法。
Go 提供了方便的函数来访问 UTF-8 作为 unicode 代码点(或 go-speak 中的 rune )。字符串上的范围循环将为您进行 utf8 解码。转换为 []rune 将为您提供一个 rune slice ,即按顺序排列的 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}
关于go - 在 Unicode 中从控制台读取输入,而不是在 golang 中读取 UTF-8(十六进制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37677828/