2017-03-05 44 views
0

我在Go中遇到json解碼器的問題。我有通過套接字進行通信的客戶端(dotnet core)和服務器(go)。編碼設置爲utf-8。在服務器端解碼後不是正確格式的字符串之一。JSON解碼器出錯UTF-8中的解碼字符串錯誤

轉到解碼代碼:

buf := make([]byte, bufferSize) 
_, err := conn.Read(buf) 
if err != nil { 
    fmt.Println("Error reading:", err.Error()) 
} 

s := string(buf[:]) 
r := strings.NewReader(s) 
d := json.NewDecoder(r) 

request := Request{} 
d.Decode(&request) 

可變小號包含正確的字符串解碼之前:https://i.stack.imgur.com/EUYF3.pngARGS包含正確的單詞 「zářit」。

解碼後弦破,幷包含這樣:https://i.stack.imgur.com/Zqan8.png

我不明白表示... + 2個從第二圖像,我不知道該怎麼這個字符串正確的方式進行解碼。

編輯:

問題的核心可以用這個代碼被複制:

package main 

import (
    "fmt" 
    "encoding/json" 
    "strings" 
) 

type Request struct { 
    Arg  string 
} 

func main() { 
    s := "{\"Arg\": \"zářit\"}" 
    r := strings.NewReader(s) 
    d := json.NewDecoder(r) 

    request := Request{} 
    d.Decode(&request) 

    for i := 0; i < len(request.Arg); i++ { 
     char := request.Arg[i] 
     fmt.Print(string(char)) 
    } 
    fmt.Println() 
    fmt.Println(request.Arg) 
} 

爲什麼輸出是不一樣的?我應該如何得到相同的結果?

+0

能否請您分享'Request'的定義是什麼? –

+0

你是如何查看解碼值的?如果您只是將其打印出來,它會是什麼樣子? – JimB

+0

你可以請添加一個示例輸入和你的struct'Request'的代碼嗎?或操場鏈接 –

回答

0
main 

import (
    "fmt" 
    "encoding/json" 
    "strings" 
) 

type Request struct { 
    Arg  string 
} 

func main() { 
    s := "{\"Arg\": \"zářit\"}" 
    r := strings.NewReader(s) 
    d := json.NewDecoder(r) 


    request := Request{} 
    d.Decode(&request) 

    for i := 0; i < len(request.Arg); i++ { 
     char := request.Arg[i] 
     fmt.Print(string(char)) 
    } 

    //example correct show 
    var tmp []rune 
    for _, x := range request.Arg { 
     fmt.Printf("%x : %v : %c\n", x,x,x) 
     tmp = append(tmp, rune(x)) 
    } 
    fmt.Printf("Result output: %v : `%s`\n", tmp, string(tmp)) 


    fmt.Println() 
    fmt.Println(request.Arg) 

} 

輸出

/usr/local/go/bin/go run /home/spouk/go/src/simple/translator 

/error_json_code.go 
záÅit7a : 122 : z 
e1 : 225 : á 
159 : 345 : ř 
69 : 105 : i 
74 : 116 : t 
Result output: [122 225 345 105 116] : `zářit` 

zářit 

Process finished with exit code 0