Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis ringkas tentang punca dan penyelesaian watak golang http yang kacau

Analisis ringkas tentang punca dan penyelesaian watak golang http yang kacau

PHPz
PHPzasal
2023-04-14 13:33:261076semak imbas

Apabila menggunakan Golang untuk penghantaran http, pengguna mungkin menghadapi masalah aksara Cina yang bercelaru, yang merupakan masalah yang sangat menyusahkan. Artikel berikut akan memperkenalkan masalah kod bercelaru yang dihadapi dalam penghantaran http di Golang dan cara menyelesaikan masalah ini.

Pengetahuan prasyarat:

Sebelum memperkenalkan cara menyelesaikan masalah bercelaru dalam penghantaran Golang http, anda perlu terlebih dahulu memahami beberapa pengetahuan asas yang berkaitan dengan ini, yang akan diperlukan dalam penyelesaian masalah nanti kepada.

  1. Apakah set watak?

Set aksara ialah kod yang menetapkan huruf, nombor, tanda baca dan aksara lain dalam susunan yang ditentukan Ia adalah surat-menyurat satu-dengan-satu aksara dalam komputer. Set aksara terkenal termasuk kod ASCII, kod Unicode, kod GB2312, kod UTF-8, dsb.

  1. Apakah pengekodan?

Pengekodan ialah proses pengekodan perkataan atau simbol tertentu ke dalam kod binari yang boleh dikenali oleh komputer. Peraturan pengekodan biasa termasuk GBK, UTF-8, UTF-16, dsb.

  1. Apakah itu kod bercelaru?

Pengekodan yang tidak konsisten akan membawa kepada aksara yang bercelaru. Aksara bercelaru merujuk kepada aksara yang dipaparkan secara tidak normal atau sebagai beberapa simbol khas.

Masalah kod bercelaru semasa menulis HTTP dalam Golang

Semasa pembangunan, kadangkala kita perlu menghantar data melalui http Pada masa ini, jika data yang dihantar mengandungi bahasa Cina, masalah kod bercelaru mungkin berlaku. Prestasi khusus adalah seperti berikut: selepas aksara Cina dibaca melalui http pada bahagian pelayan, ia tidak boleh dipaparkan secara normal (dipaparkan sebagai beberapa simbol pelik).

Sebab masalah ini ialah protokol http hanya boleh menghantar kod ASCII, dan aksara Cina tidak tergolong dalam aksara dalam kod ASCII. Oleh itu, apabila kami menghantar aksara Cina dalam http, Golang akan menggunakan kaedah pengekodan lalai untuk menukarnya kepada tatasusunan binari, yang mungkin tidak konsisten dengan kaedah pengekodan yang digunakan oleh pelayan untuk menghuraikan data, mengakibatkan ralat penghuraian.

Penyelesaian:

  1. Pelayan dan klien menggunakan kaedah pengekodan yang sama

Kaedah pengekodan yang digunakan apabila pelayan menghuraikan data dan klien Apabila pengekodan kaedah yang digunakan apabila data masuk adalah konsisten, aksara Cina tidak akan bercelaru dalam kes ini. Oleh itu, jika anda ingin menyelesaikan masalah aksara Cina bercelaru yang dihantar oleh Golang http, cara paling mudah ialah menggunakan kaedah pengekodan yang sama pada kedua-dua pelayan dan pelanggan.

Berikut ialah contoh mudah:

package main

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

func main() {
    url := "http://example.com"
    resp, err := http.PostForm(url, url.Values{"key": {"中文字符串"}})
    if err != nil {
        fmt.Println("http请求失败:", err)
        return
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

Dalam contoh di atas, data yang digunakan semasa mengisi permintaan PostForm ialah url.Values{"key": {"Chinese string" } }, pelayan menggunakan pengekodan UTF-8 untuk memproses data, jadi aksara Cina tidak akan kacau.

  1. Tukar aksara Cina kepada kod heex panjang ganjil

Jika kaedah pengekodan pelayan dan klien tidak dapat dijamin konsisten, anda juga boleh menukar aksara Cina kepada ganjil- kaedah kod hex panjang kod hex. Kaedah ini boleh memastikan bahawa pengekodan aksara Cina selepas penghantaran boleh dihuraikan kepada aksara yang betul.

Berikut ialah contoh mudah:

package main

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

func main() {
    url := "http://example.com"
    resp, err := http.PostForm(url, url.Values{"key": {ToHex("中文字符串")}})
    if err != nil {
        fmt.Println("http请求失败:", err)
        return
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

func ToHex(str string) string {
    data := []byte(str)
    result := make([]byte, len(data)*2+1)
    for i := 0; i < len(data); i++ {
        b := data[i]
        result[i*2] = "0123456789ABCDEF"[b>>4]
        result[i*2+1] = "0123456789ABCDEF"[b&15]
    }
    return string(result)
}

Dalam contoh di atas, nilai sebenar yang diluluskan untuk parameter "key": {ToHex("Chinese String")} ialah "key ": {"E4B8ADE69687E698AFE5AD97E7ACA6E4B8B2E78987"}, di sini fungsi ToHex dalam Golang digunakan untuk menukar rentetan Cina kepada kod hex panjang ganjil, sekali gus memastikan data tidak akan bercelaru apabila dihuraikan pada bahagian pelayan.

Ringkasan

Semasa proses penghantaran HTTP Golang, pemprosesan aksara Cina agak istimewa, dan pembangun perlu memberi perhatian khusus kepada kaedah pengekodan untuk mengelakkan masalah yang tidak perlu. Jika anda perlu menghantar aksara Cina, anda boleh menyelesaikan masalah aksara bercelaru melalui dua kaedah di atas.

Atas ialah kandungan terperinci Analisis ringkas tentang punca dan penyelesaian watak golang http yang kacau. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn