2016-06-07 3 views
-3

콘솔에서 bufio로 사용자 입력을 읽으려고합니다. 텍스트에는 특수 문자 (é, à, ♫, ╬, ...)가있을 수 있습니다. 이 같은golang에서 UTF-8 (hex) 대신 유니 코드로 콘솔에서 입력 읽기

코드의 모양을

내가 예를 들어, "é"를 입력하면
reader := bufio.NewReader(os.Stdin) 
input, _ := reader.ReadString('\n') 

가의 ReadString 대신 "00e9"의 "A9 C3 '로 읽습니다. UTF-8 대신 유니 코드로 텍스트 입력을 읽으려면 어떻게해야합니까? 이 값을 해시 테이블 키로 사용해야합니다.

감사

답변

0

유니 코드 및 UTF8는 비교할 수 없습니다. 문자열은 유니 코드와 utf8이 될 수 있습니다. Strings, bytes, runes and characters in Go을 읽음으로써 많은 것을 배웠습니다.

당신은 unicode/utf8 패키지에서 DecodeRuneInString을 사용할 수 있습니다 귀하의 질문에,

대답합니다. 무엇 DecodeRuneInString(s)

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

은 그 문자가 바이트 폭과 함께 s의 첫 UTF8 인코딩 된 문자 (룬)를 반환한다. 따라서 룬에서 각 룬의 유니 코드 코드 포인트를 얻고 싶다면 어떻게해야 하는지를 알아보십시오. 이것은 약간 수정 된 링크 된 문서에 주어진 예제입니다.

str := "Hello, 世界" 

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

    str = str[size:] 
} 

Playground에서 시도해보십시오.

Juergen이 지적한 것처럼 문자열에 범위 루프를 사용하여 문자열에 포함 된 룬을 얻을 수 있습니다. Playground

+0

그것은 인덱싱을 지원하지 않는 작업 만 룬을, 그건. – Jackenn

+0

"색인 생성을 지원하지 않습니다"라는 말은 해시 테이블의 키로 사용할 수 없다는 의미입니까? 가능한 경우 더 많은 코드를 게시하고 원하는 것을 설명하십시오. 아마 내가 도울 수있어. –

+0

귀하의 우려를 이해한다고 생각합니다. 내 편집을 참조하십시오. –

1

이동 문자열의

str := "Hello, 世界" 

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

봅니다 개념적으로 읽기 전용 된 ByteArray에 대한 읽기 전용 슬라이스입니다. 해당 bytearray의 인코딩은 지정되지 않지만 문자열 상수는 UTF-8이며 다른 문자열에서 UTF-8을 사용하는 것이 좋습니다.

Go는 UTF-8에 유니 코드 코드 포인트 (또는 이동 중에있는 룬 문자)로 액세스하기위한 편리한 기능을 제공합니다. 문자열에 대한 범위 루프는 utf8 디코딩을 수행합니다. [] 룬으로 변환하면 룬 슬라이스 즉 유니 코드 코드 포인트가 순서대로 제공됩니다. 이러한 기능은 UTF-8로 인코딩 된 문자열/bytearrays에서만 작동합니다. 나는 내부적으로 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}