在Go中进行HTTP请求时出现乱码字符串

3

我在使用Go语言进行Get请求时遇到了乱码问题,代码如下:

req , err:= http.NewRequest(httpMethod, url,strings.NewReader(""))
req.Header.Add("Accept","application/json")
resp, err := http.DefaultClient.Do(req)
body,err := ioutil.ReadAll(resp.Body)
ret := string(body)
log.Warningf("ret: %+v", ret)

如果返回值只包含英文,则是正确的;如果包含中文,则会出现乱码,如何解决这个问题,谢谢大家!

2个回答

4

在我的情况下,网站没有在Content-Type中回应字符集,并且没有回应请求:req.Header.Add("Accept-Charset", "utf-8")

我在Visual Studio Code中打开了文件,并一直切换编码以找到最合适的一个“Reopen With Encoding”。

一旦我确定了使用的编码,我只需使用函数:

dec := charmap.Windows1250.NewDecoder()
output, _ := dec.Bytes(body)

来自:"golang.org/x/text/encoding/charmap"

完整代码示例:

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
    "golang.org/x/text/encoding/charmap"
)

func main() {

    client := &http.Client{}

    req, err := http.NewRequest("GET", "example.com", nil)

    if err != nil {
        fmt.Println(err)
        return
    }

    resp, err := client.Do(req)

    if err != nil {
        fmt.Println(err)
        return
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        fmt.Println(err)
        return
    }

    dec := charmap.Windows1250.NewDecoder()

    output, err:= dec.Bytes(body)

    if err != nil {
        fmt.Println(err)
        return
    }

    // do something with output

}

我在Visual Studio上找不到“以编码方式重新打开”选项,你能告诉我它在哪里吗? - undefined
在右下方有一个标签显示当前编码。点击该标签(例如"UTF-8"),顶部会出现"以指定编码重新打开"的选项,如果文件已经保存。https://imgur.com/a/jRTvO9e - undefined

3

Go字符串可以包含任何类型的字符,但在打印它们时,这些字符将被解释为utf-8编码。

你可以尝试添加:

req.Header.Add("Accept-Charset","utf-8")

如果那样不起作用,您可以尝试使用该软件包将任何字符集转换为utf-8:https://godoc.org/golang.org/x/text/encoding。字符集取决于您请求的页面。如果是HTML,则响应标头中有时会这样指定字符集:
Content-Type: text/html; charset=utf-8

因此,您需要确定字符集是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接