为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
陪伴而非守候 2022-01-17 16:17:06
我正在尝试在控制台中使用 bufio 读取用户输入。文本可以包含一些特殊字符(é、à、♫、╬、...)。代码如下所示:reader := bufio.NewReader(os.Stdin)input, _ := reader.ReadString('\n')例如,如果我键入“é”,ReadString 会将其读取为“c3 a9”而不是“00e9”。如何读取 Unicode 而不是 UTF-8 的文本输入?我需要将此值用作哈希表键。谢谢
查看完整描述

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}


查看完整回答
反对 回复 2022-01-17
?
小怪兽爱吃肉

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)

}


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号