Utf 8 如何解压缩gzip格式的[]字节内容,该内容在解组时会出现错误

Utf 8 如何解压缩gzip格式的[]字节内容,该内容在解组时会出现错误,utf-8,go,Utf 8,Go,我正在向一个API发出请求,用它我从响应中得到一个[]字节(ioutil.ReadAll(resp.Body))。我正在尝试解组此内容,但似乎没有以utf-8格式编码,因为解组返回错误。我正在尝试这样做: package main import ( "encoding/json" "fmt" "some/api" ) func main() { content := api.SomeAPI.SomeRequest() // []byte variable

我正在向一个API发出请求,用它我从响应中得到一个
[]字节
ioutil.ReadAll(resp.Body)
)。我正在尝试解组此内容,但似乎没有以utf-8格式编码,因为解组返回错误。我正在尝试这样做:

package main

import (
    "encoding/json"
    "fmt"

    "some/api"
)

func main() {
    content := api.SomeAPI.SomeRequest() // []byte variable
    var data interface{}
    err := json.Unmarshal(content, &data)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("Data from response", data)
}
我得到一个错误,
查找值开头的无效字符“\x1f”
。对于记录,响应在标题中包含
内容类型:[application/json;charset=utf-8]

如何解码
内容
以避免在解组时出现这些无效字符

编辑


这是
内容的hexdump

根据您的hex dump判断,您正在接收gzip编码的数据,因此您需要先使用它来解码

试试这样的

package main

import (
    "bytes"
    "compress/gzip"
    "encoding/json"
    "fmt"
    "io"
    "some/api"
)

func main() {
    content := api.SomeAPI.SomeRequest() // []byte variable

    // decompress the content into an io.Reader
    buf := bytes.NewBuffer(content)
    reader, err := gzip.NewReader(buf)
    if err != nil {
        panic(err)
    }

    // Use the stream interface to decode json from the io.Reader
    var data interface{}
    dec := json.NewDecoder(reader)
    err = dec.Decode(&data)
    if err != nil && err != io.EOF {
        panic(err)
    }
    fmt.Println("Data from response", data)
}
以前的

字符
\x1f
是ASCII和UTF-8中的单位分隔符。它从来不是UTF-8编码的一部分,但是可以用来标记不同的文本位。据我所知,带有
\x1f
的字符串可以是有效的UTF-8,但不是有效的json

我认为您需要仔细阅读API规范,以了解他们使用
\x1f
标记的目的,但与此同时,您可以尝试删除它们,看看会发生什么,例如

import (
    "bytes"
    "fmt"
)

func main() {
    b := []byte("hello\x1fGoodbye")
    fmt.Printf("b was %q\n", b)
    b = bytes.Replace(b, []byte{0x1f}, []byte{' '}, -1)
    fmt.Printf("b is now %q\n", b)
}
印刷品

b was "hello\x1fGoodbye"
b is now "hello Goodbye"

基本上,在引入此修复程序时,我发现了新的无效字符:
无效字符'\u008b'查找值的开头
。我不认为逐个替换它们是解决方案。这是另一个ASCII控制字符。。。你最好发布一个十六进制转储你实际收到的!您可以再次编辑并删除“(未测试)”,因为我做了,它工作正常,谢谢!