2016-06-07 12 views
-3

我試圖在控制檯中讀取帶有bufio的用戶輸入。文字可以有一些特殊字符(é,à,♫,╬,...)。從控制檯以Unicode讀取輸入,而不是使用UTF-8(十六進制)在golang中輸入

的代碼如下所示:

reader := bufio.NewReader(os.Stdin) 
input, _ := reader.ReadString('\n') 

如果我輸入例如「E」的ReadString將它讀作「C3 A9」,而不是「00e9」。我如何讀取Unicode而不是UTF-8的文本輸入?我需要使用這個值作爲散列表鍵。

謝謝

回答

0

Unicode和utf8是不可比較的。字符串可以是unicode和utf8。我通過閱讀Strings, bytes, runes and characters in Go瞭解了很多關於這些的東西。

要回答你的問題,

您可以使用DecodeRuneInStringunicode/utf8包。

s := "é" 
rune, _ := utf8.DecodeRuneInString(s) 
fmt.Printf("%x", rune) 

做什麼DecodeRuneInString(s)是,它沿與該字符以字節寬度返回s第一UTF8編碼的字符(符)。所以如果你想獲得一個字符串中每個符文的unicode代碼點,那麼該怎麼做。這是鏈接文檔中給出的示例僅稍作修改。

str := "Hello, 世界" 

for len(str) > 0 { 
    r, size := utf8.DecodeRuneInString(str) 
    fmt.Printf("%x %v\n", r, size) 

    str = str[size:] 
} 

試試Playground

另外,正如Juergen指出的,你可以使用字符串上的範圍循環來獲得字符串中包含的符文。

str := "Hello, 世界" 

for _, rune := range(str) { 
    fmt.Printf("%x \n", rune) 
} 

Playground

+0

它做的工作,但符不支持索引,這就是爲什麼它是一個字符串。 – Jackenn

+0

「不支持索引」是否意味着您不能將它用作散列表中的鍵?如果可以的話,發佈更多的代碼並解釋你想做什麼。也許我可以幫忙。 –

+0

我想我理解你的關心。查看我的編輯。 –

1

圍棋串嘗試在概念上是一個只讀切片只讀字節組。該字節數組的編碼沒有被指定,但字符串常量將是UTF-8,並且在其他字符串中使用UTF-8是推薦的方法。

Go提供了訪問UTF-8作爲unicode代碼點(或go-speak中的符文)的便利功能。字符串上的範圍循環將爲您執行utf8解碼。轉換爲[]符文會給你一個符文切片,即按順序的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 E 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} 
相關問題