Искаженная строка при выполнении http запроса в Go - PullRequest
0 голосов
/ 04 июня 2018

Я встречал вопрос с искаженной строкой, когда выполнял запрос Get в 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 голосов
/ 19 ноября 2018

В моем случае веб-сайт не ответил с набором символов в Content-Type и не ответил с запрошенным: req.Header.Add("Accept-Charset", "utf-8")

Я открыл файл в коде Visual Studio и переключал кодировку, чтобы выяснить,какая из них лучше всего работает "Reopen With Encoding".

Как только я выяснил, какая это кодировка, я просто использовал функцию:

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

from: "golang.org/x/text/encoding/charmap"

FullПример кода:

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

}
0 голосов
/ 04 июня 2018

Строки 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

Так что вам нужно выяснить, что такое кодировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...