golang http でコードが文字化けする

WBOY
リリース: 2023-05-15 09:00:12
オリジナル
992 人が閲覧しました

近年、Go 言語の人気に伴い、ネットワーク アクセスに HTTP を使用するプログラムなどの Web アプリケーションを開発するために Go 言語を使用する人が増えています。ただし、HTTP GET リクエストで文字化けが発生するのはよくある問題です。この記事では、この問題とその考えられる原因を調査し、いくつかの解決策を提供します。

1. 問題の説明

Go 言語を使用して HTTP GET リクエストを作成すると、テキストが文字化けする問題が発生することがあります。主な症状は、リクエストによって返された応答本文に、予期した結果ではなく文字化けした文字が含まれていることです。

2. 問題の原因

HTTP GET リクエストが文字化けする原因は多数考えられます。一般的な理由をいくつか挙げます:

1. 正しい文字セットが使用されていない. . HTTP リクエストの応答ヘッダーで、サーバーはドキュメントの文字セットを返します。この値を正しく解析しないと、エンコードの問題が発生する可能性があります。

2. 文字セットが指定されていません。サーバーが文字セット情報を提供しない場合があります。文字セットを指定しないと、エンコードの問題が発生する可能性があります。

3. 文字セットが一致しません。リクエストヘッダとレスポンスヘッダの文字セットが一致しない場合があり、文字化けが発生する場合があります。

4. ファイルからデータを読み取るときに、指定されたエンコードが実際のエンコードと一致しないため、文字化けが発生する可能性もあります。

3. 解決策

1. サーバー応答の文字セットを確認する

: HTTP GET では、サーバーの応答ヘッダーに文字セット情報が含まれています。この値を正しく確認および解析しないと、文字化けが発生する可能性があります。正しい方法は、Go 言語の net/http ライブラリで提供される resp.Header.Get("Content-Type") メソッドを使用して、Content-Type 応答ヘッダー情報を取得し、そこから文字セット値を取得することです。次に、この文字セットを使用して応答本文を正しい文字列に変換する必要があります。たとえば、応答ヘッダーの文字セットが UTF-8 の場合、次のメソッドを使用して応答本文を UTF-8 でエンコードされた文字列に変換できます。

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()
}
ログイン後にコピー

2. 正しい文字セットを指定する

HTTP GET リクエストを送信するときは、リクエスト ヘッダーで文字セットを指定する必要があります。この場合、Go 言語の net/http ライブラリで提供される Req.Header.Set("Content-Type", "text/html; charset=UTF-8") メソッドを使用して Content-Type を指定する必要があります。たとえば、UTF-8 エンコーディングを使用して UTF-8 テキストを送信したい場合は、次のコードを使用できます。

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()
}
ログイン後にコピー

3.Character Set Conversion

正しい文字セットを指定する場合文字化けが発生した場合は、返されたコンテンツに対して文字セット変換を実行する必要がある場合があります。 Go 言語の golang.org/x/text/transform ライブラリで提供されるtransform.String() メソッドを使用して文字列を変換できます。たとえば、ファイルから ISO-8859-1 でエンコードされたテキストを読み取ったが、サーバーが UTF-8 でエンコードされたテキストを返した場合、次のコードを使用して変換できます。

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
    ...
}
ログイン後にコピー

4. 結論

HTTP GET リクエストの文字化けは、ネットワーク リクエストの結果に影響を与える可能性があります。この問題が発生した場合は、まず文字セット情報を確認し、文字セットが正しく指定されているかどうかを確認してください。上記のいずれでも問題が解決しない場合は、文字セット変換を実行する必要がある可能性があります。この記事で説明した方法が、HTTP GET リクエストの文字化け問題の解決に役立つことを願っています。

以上がgolang http でコードが文字化けするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート