在Go中执行http请求时出现乱码

时间:2018-06-04 01:45:13

标签: string http go

我在Go中获取请求时遇到了一个乱码字符串问题,代码是:

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)

如果ret只包含英文,那么它是正确的,如果包含中文,它有乱码,如何解决这个问题,谢谢大家!

2 个答案:

答案 0 :(得分:2)

Go字符串可以包含任何类型的字符,但在打印字符时,字符被解释为utf-8。

您可以尝试添加:

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

如果这不起作用,您可以尝试使用此程序包从任何字符集转换为utf-8:

https://godoc.org/golang.org/x/text/encoding

charset取决于您请求的页面。如果是html,则有时在响应头中指定charset:

Content-Type: text/html; charset=utf-8

所以你需要弄清楚charset是什么。

答案 1 :(得分:0)

在我的情况下,网站未使用Content-Type中的字符集进行响应,也未回复以下请求:req.Header.Add("Accept-Charset", "utf-8")

我在Visual Studio Code中打开了文件,并一直在切换编码,以找出哪种方式最适合“使用编码重新打开”。

一旦我弄清楚它是哪种编码,我就简单地使用函数:

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

}