go - 在 Unicode 中从控制台读取输入,而不是在 golang 中读取 UTF-8(十六进制)

标签 go unicode utf-8

我正在尝试在控制台中使用 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/

相关文章:

go - 在字段(golang)中嵌入结构的目的是什么?

python - 在 pyyaml 中处理 bool 值

python - 为什么有些字符串采用 utf-16 编码,而另一些字符串仅采用 utf-8 编码?

go - 用结构解码复杂的 JSON 广告

javascript - 取消转义 JavaScript 中的转义字符串

perl - Text::SpellChecker 模块和 Unicode

c++ - MessageBox 从 TCHAR 缓冲区打印额外的 unicode 字符

PHP声明编码

ruby-on-rails - Ruby on Rails - Encoding::UndefinedConversionError: "\xC3"从 ASCII-8BIT 到 UTF-8

go - 防止 Go Public 文件夹中的目录列表