亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號