Utf 8 如何解压缩gzip格式的[]字节内容,该内容在解组时会出现错误
我正在向一个API发出请求,用它我从响应中得到一个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
[]字节
(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控制字符。。。你最好发布一个十六进制转储你实际收到的!您可以再次编辑并删除“(未测试)”,因为我做了,它工作正常,谢谢!