2017-03-05 42 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