Golang http erhält verstümmelten Code

WBOY
Freigeben: 2023-05-15 09:00:12
Original
991 Leute haben es durchsucht

Mit der Popularität der Go-Sprache haben in den letzten Jahren immer mehr Menschen begonnen, die Go-Sprache zur Entwicklung von Webanwendungen zu verwenden, einschließlich Programmen, die HTTP für den Netzwerkzugriff verwenden. Allerdings ist es ein häufiges Problem, bei HTTP-GET-Anfragen auf verstümmelte Zeichen zu stoßen. In diesem Artikel werden dieses Problem und seine möglichen Ursachen untersucht und einige Lösungen bereitgestellt.

1. Problembeschreibung

Beim Schreiben von HTTP-GET-Anfragen in der Go-Sprache stoßen wir manchmal auf das Problem von verstümmeltem Text. Das Hauptsymptom besteht darin, dass der von der Anfrage zurückgegebene Antworttext verstümmelte Zeichen anstelle der erwarteten Ergebnisse enthält.

2. Ursache des Problems

Es kann viele Gründe für verstümmelte HTTP-GET-Anfragen geben:

1. Der richtige Zeichensatz wird nicht verwendet. Im Antwortheader der HTTP-Anfrage gibt der Server den Zeichensatz des Dokuments zurück. Wenn wir diesen Wert nicht richtig analysieren, kann es zu Codierungsproblemen kommen.

2. Kein Zeichensatz angegeben. Manchmal stellt der Server keine Zeichensatzinformationen bereit. Wenn wir keinen Zeichensatz angeben, kann es zu Codierungsproblemen kommen.

3. Zeichensatz stimmt nicht überein. Manchmal stimmen die Zeichensätze im Anforderungsheader und Antwortheader nicht überein, was zu verstümmelten Zeichen führen kann.

4. Beim Lesen von Daten aus einer Datei stimmt die angegebene Kodierung nicht mit der tatsächlichen Kodierung überein, was ebenfalls zu verstümmelten Zeichen führen kann.

3. Lösung

1. Überprüfen Sie den Zeichensatz der Serverantwort

: In HTTP GET enthält der Antwortheader des Servers Zeichensatzinformationen. Wenn wir diesen Wert nicht korrekt überprüfen und analysieren, kann es zu verstümmelten Zeichen kommen. Der richtige Weg besteht darin, die Methode resp.Header.Get("Content-Type") zu verwenden, die in der net/http-Bibliothek der Go-Sprache bereitgestellt wird, um die Content-Type-Antwortheaderinformationen abzurufen und daraus den Zeichensatzwert zu erhalten. Anschließend müssen wir diesen Zeichensatz verwenden, um den Antworttext in die richtige Zeichenfolge umzuwandeln. Wenn der Zeichensatz im Antwortheader beispielsweise UTF-8 ist, können wir den Antworttext mit der folgenden Methode in eine UTF-8-codierte Zeichenfolge konvertieren.

import (
    "io/ioutil"
    "net/http"
)

func main() {
    resp, err := http.Get("http://example.com/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        // handle error
    }

    contentType := resp.Header.Get("Content-Type")
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }

    // convert body bytes to string
    var content string
    if strings.Contains(contentType, "UTF-8") {
        content = convertToString(string(body), "UTF-8", "UTF-8")
    } else {
        content = convertToString(string(body), contentType, "UTF-8")
    }
}

func convertToString(content string, srcEncoding string, destEncoding string) string {
    srcDecoder := charmap.Windows1252.NewDecoder()
    srcReader := strings.NewReader(content)
    srcReader.Reset(content)
    srcUTF8Reader := transform.NewReader(srcReader, srcDecoder)
    destDecoder := charmap.ISO8859_1.NewDecoder()
    destWriter := new(bytes.Buffer)
    destUTF8Writer := transform.NewWriter(destWriter, destDecoder)
    io.Copy(destUTF8Writer, srcUTF8Reader)
    return destWriter.String()
}
Nach dem Login kopieren

2. Geben Sie den richtigen Zeichensatz an

Beim Senden einer HTTP-GET-Anfrage sollten wir den Zeichensatz im Anforderungsheader angeben. In diesem Fall müssen wir die Methode Req.Header.Set("Content-Type", "text/html; charset=UTF-8") verwenden, die in der net/http-Bibliothek der Go-Sprache bereitgestellt wird, um den Content-Type anzugeben. Wenn wir beispielsweise UTF-8-Text mit UTF-8-Kodierung senden möchten, können wir den folgenden Code verwenden:

import (
    "net/http"
)

func main() {
    client := http.Client{}
    req, err := http.NewRequest("GET", "http://example.com/", nil)
    if err != nil {
        // handle error
    }

    req.Header.Set("Content-Encoding", "gzip")
    req.Header.Set("Content-Type", "text/html; charset=UTF-8")

    resp, err := client.Do(req)
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
}
Nach dem Login kopieren

3. Zeichensatzkonvertierung

Wenn wir den richtigen Zeichensatz angeben, aber immer noch auf das Problem verstümmelter Zeichen stoßen , dann muss möglicherweise eine Zeichensatzkonvertierung für den zurückgegebenen Inhalt durchgeführt werden. Wir können die Methode transform.String() verwenden, die in der Bibliothek golang.org/x/text/transform der Go-Sprache bereitgestellt wird, um Zeichenfolgen zu konvertieren. Angenommen, wir lesen einen ISO-8859-1-codierten Text aus der Datei, der Server gibt jedoch UTF-8-codierten Text zurück. Wir können den folgenden Code zum Konvertieren verwenden:

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

func main() {
    resp, err := http.Get("http://example.com/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        // handle error
    }

    // read body
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }

    // convert body bytes to string
    s, _, err := transform.String(charmap.ISO8859_1.NewDecoder().Transformer(), string(body))
    if err != nil {
        // handle error
    }

    // do something with s
    ...
}
Nach dem Login kopieren

IV Fazit

HTTP GET Verstümmelte Zeichen Anfragen können sich auf die Ergebnisse Ihrer Netzwerkanfragen auswirken. Wenn dieses Problem auftritt, überprüfen Sie zunächst die Zeichensatzinformationen und dann, ob der Zeichensatz korrekt angegeben ist. Wenn keine der oben genannten Maßnahmen Ihr Problem löst, müssen Sie möglicherweise eine Zeichensatzkonvertierung durchführen. Ich hoffe, dass die in diesem Artikel bereitgestellten Methoden Ihnen helfen können, das Problem verstümmelter Zeichen in HTTP-GET-Anfragen zu lösen.

Das obige ist der detaillierte Inhalt vonGolang http erhält verstümmelten Code. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage