Rumah > pembangunan bahagian belakang > Golang > kod golang byte bercelaru

kod golang byte bercelaru

王林
Lepaskan: 2023-05-21 19:38:36
asal
1171 orang telah melayarinya

golang ialah bahasa pengaturcaraan yang sangat popular, pesat membangun dan mudah dipelajari. Walau bagaimanapun, apabila menggunakan golang untuk pengekodan aksara, aksara bercelaru bait kadangkala berlaku. Artikel ini menerangkan sebab ini berlaku dan penyelesaiannya.

Dalam golang, jenis rentetan terdiri daripada jenis bait. Dalam golang, aksara boleh terdiri daripada berbilang bait. Ini bermakna apabila rentetan ditukar kepada bait, sesetengah bait mungkin bukan pengekodan aksara yang sah. Dalam kes ini, hasil keluaran selepas penukaran bait adalah kod bercelaru.

Penyelesaian kepada masalah ini adalah untuk memastikan pengekodan aksara yang betul digunakan dalam operasi penukaran bait. Dalam golang, anda boleh menggunakan kaedah EncodeRune dan DecodeRune yang disediakan oleh pakej unicode/utf8, yang boleh memastikan bahawa operasi penukaran bait menggunakan pengekodan aksara yang betul.

Di bawah, mari lihat beberapa contoh khusus untuk menggambarkan bahawa apabila menggunakan pengekodan aksara yang berbeza, bait akan bercelaru.

Pertama, kami menggunakan jenis rentetan terbina dalam golang, yang mengandungi beberapa aksara khas:

package main

import "fmt"

func main() {
    s := "aæøå"
    b := []byte(s)
    fmt.Println(string(b))
}
Salin selepas log masuk

Dalam contoh ini, kami menukar rentetan yang mengandungi aksara khas kepada kepingan bait, Kemudian tukar bait potong kembali menjadi tali. Dalam proses ini, kami tidak menyatakan pengekodan aksara. Hasil output adalah seperti berikut:

aæøå
Salin selepas log masuk
Salin selepas log masuk

Seperti yang anda lihat, tiada bait bercelaru dalam contoh ini. Walau bagaimanapun, apabila kami menggunakan pengekodan aksara bukan UTF-8, fenomena bercelaru bait akan berlaku:

package main

import (
    "fmt"
    "golang.org/x/text/encoding/charmap"
)

func main() {
    s := "aæøå"
    b := []byte(s)

    // 使用ISO-8859-1字符编码进行转换
    encoded := charmap.ISO8859_1.NewEncoder()
    encodedBytes, err := encoded.Bytes(b)
    if err != nil {
        fmt.Println("encode failed:", err.Error())
        return
    }

    decoded := charmap.ISO8859_1.NewDecoder()
    decodedBytes, err := decoded.Bytes(encodedBytes)
    if err != nil {
        fmt.Println("decode failed:", err.Error())
        return
    }

    fmt.Println(string(decodedBytes))
}
Salin selepas log masuk

Dalam contoh ini, kami menggunakan pakej golang.org/x/text/encoding/charmap untuk menukar aksara Tukar rentetan kepada pengekodan aksara ISO-8859-1. Kemudian, tukarkan hirisan bait kembali kepada rentetan. Dalam proses ini, kami menentukan pengekodan aksara ISO-8859-1. Hasil output adalah seperti berikut:

aæøå
Salin selepas log masuk

Seperti yang anda lihat, hasil output adalah bait bercelaru. Ini disebabkan kami menggunakan pengekodan aksara yang salah untuk penukaran. Untuk menyelesaikan masalah ini, kita perlu menggunakan pengekodan aksara yang betul untuk penukaran, seperti menggunakan pengekodan aksara UTF-8:

package main

import (
    "fmt"
    "golang.org/x/text/encoding/charmap"
    "golang.org/x/text/encoding/unicode"
    "golang.org/x/text/transform"
)

func main() {
    s := "aæøå"
    b := []byte(s)

    // 使用ISO-8859-1字符编码进行转换
    encoded := charmap.ISO8859_1.NewEncoder()
    utf8Bytes, err := transform.Bytes(encoded, b)
    if err != nil {
        fmt.Println("encode failed:", err.Error())
        return
    }

    // 将转换后的字节切片使用UTF-8字符编码进行解码
    decoded := unicode.UTF8.NewDecoder()
    utf8String, err := transform.String(decoded, string(utf8Bytes))
    if err != nil {
        fmt.Println("decode failed:", err.Error())
        return
    }

    fmt.Println(utf8String)
}
Salin selepas log masuk

Dalam contoh ini, kita mula-mula menukar rentetan kepada pengekodan aksara ISO-8859-1 Bait dihiris, dan kemudian kepingan bait ditukar menggunakan pengekodan aksara UTF-8 menggunakan fungsi transform.Bytes dalam pakej golang.org/x/text/transform. Akhir sekali, kami menukar kepingan bait yang ditukar kepada rentetan menggunakan fungsi transform.String dalam pakej golang.org/x/text/transform. Hasil output adalah seperti berikut:

aæøå
Salin selepas log masuk
Salin selepas log masuk

Anda boleh melihat bahawa hasil output tidak mempunyai aksara bercelaru bait Ini kerana kami menggunakan pengekodan aksara yang betul untuk operasi penukaran.

Ringkasnya, jika terdapat masalah bercelaru bait dalam golang, sebabnya mungkin kami menggunakan pengekodan aksara yang salah untuk melaksanakan operasi penukaran. Penyelesaian yang betul ialah memastikan pengekodan aksara yang betul digunakan untuk operasi penukaran Anda boleh menggunakan pakej golang.org/x/text atau alat lain yang serupa untuk memastikan ketepatan pengekodan aksara.

Atas ialah kandungan terperinci kod golang byte bercelaru. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan