Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyelesaikan masalah golang byte bercelaru

Bagaimana untuk menyelesaikan masalah golang byte bercelaru

PHPz
PHPzasal
2023-03-31 10:24:391568semak imbas

Dalam beberapa tahun kebelakangan ini, apabila bahasa Go semakin popular, semakin ramai orang memilih untuk menggunakan bahasa Go untuk membangunkan projek. Walau bagaimanapun, dalam proses menggunakan pembangunan bahasa Go, kadangkala kami menghadapi beberapa masalah yang tidak dapat dijelaskan Salah satu masalah yang lebih biasa ialah masalah bercelaru bait. Seterusnya, kami akan memperkenalkan masalah kacau bait secara terperinci dan menyediakan beberapa penyelesaian.

Pertama sekali, kita perlu tahu apa itu bait. Dalam bahasa Go, bait ialah jenis nombor asli, mewakili nilai bait 8-bit (integer 8-bit tidak bertanda), yang boleh digunakan untuk mewakili aksara ASCII. Rune ialah integer, mewakili aksara Unicode, yang boleh digunakan untuk mewakili aksara ASCII dan aksara berbilang bait yang lain. Biasanya, kami menggunakan rentetan untuk menyimpan aksara, dan kepingan bait ([]bait) digunakan untuk menyimpan urutan bait rentetan kod ASCII, iaitu, satu aksara sepadan dengan satu bait.

Apabila kita menukar aksara kepada kepingan bait (iaitu, menukar rentetan kepada []bait), kadangkala aksara yang bercelaru akan berlaku. Sebagai contoh, kod berikut:

func main() {
    str := "你好,世界!"
    b := []byte(str)
    fmt.Println(b)
}

Hasil output ialah:

[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]

Seperti yang anda lihat, program tidak mengeluarkan "Hello, dunia!" tetapi sekumpulan watak Garbled. Jadi, mengapa ini?

Sebenarnya, ini adalah kerana lapisan bawah rentetan dalam bahasa Go ialah tatasusunan bait Apabila menukar rentetan kepada kepingan bait, aksara dalam rentetan akan ditukar kepada jenis bait satu demi satu. Dalam pengekodan UTF-8, aksara Cina ialah 3 bait, manakala huruf Inggeris hanya 1 bait. Oleh itu, apabila kita menukar aksara Cina kepada bait, kita perlu menduduki 3 bait, tetapi apabila menukar rentetan kepada []bait, setiap aksara hanya menduduki satu bait, jadi masalah aksara bercelaru berlaku.

Sebagai contoh, dua aksara "Hello" sepadan dengan pengekodan perenambelasan E4BDA0 E5A5BD dalam pengekodan UTF-8 Hasil menukarnya kepada jenis bait ialah:

[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}

Jika anda secara langsung. sambung dua bait bersama-sama, anda akan mendapat:

[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}

Dengan cara ini, aksara bercelaru akan berlaku. Oleh itu, apabila menukar rentetan kepada kepingan bait, kita perlu menggunakan fungsi yang berkaitan dalam pakej rentetan untuk penukaran, seperti strconv.Atoi(), strconv.ParseInt(), strconv.ParseUint(), strconv.ParseFloat() , strconv. Quote() dan sebagainya.

Sudah tentu, dalam beberapa kes khas, kami juga boleh menukar rentetan secara manual kepada jenis bait dan bukannya menggunakan fungsi dalam pakej rentetan. Kaedah operasi khusus adalah seperti berikut:

func main() {
    str := "你好,世界!"
    b := make([]byte, len(str)*3)
    blen := 0
    for _, runeValue := range str {
        c := utf8.EncodeRune(b[blen:], runeValue)
        blen += c
    }
    fmt.Println(b[:blen])
}

Hasil output ialah:

[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]

Seperti yang anda lihat, hasil penukaran manual kami adalah konsisten dengan hasil yang diperoleh dengan menggunakan fungsi dalam pakej rentetan.

Selain kaedah di atas, kami juga boleh menggunakan perpustakaan pihak ketiga untuk membantu menyelesaikan masalah bercelaru bait, seperti GORM, goka, gRPC, dll.

Ringkasnya, apabila menggunakan bahasa Go untuk membangunkan projek, kita mesti memberi perhatian kepada masalah aksara bercelaru bait, dan menggunakan fungsi dalam pakej rentetan untuk penukaran sebanyak mungkin, atau menggunakan perpustakaan pihak ketiga. Hanya dengan menyelesaikan masalah ini dengan betul kita boleh menggunakan bahasa Go untuk kerja pembangunan dengan lebih baik.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah golang byte bercelaru. 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
Artikel sebelumnya:Cara memasang program GolangArtikel seterusnya:Cara memasang program Golang