Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Go Mengendalikan Urutan Bait Tidak Sah Apabila Menukar kepada Rentetan?

Bagaimanakah Go Mengendalikan Urutan Bait Tidak Sah Apabila Menukar kepada Rentetan?

Linda Hamilton
Linda Hamiltonasal
2024-12-06 04:44:17532semak imbas

How Does Go Handle Invalid Byte Sequences When Converting to Strings?

Pengesahan Jujukan Bait Tidak Sah dalam Go

Apabila cuba menukar kepingan bait ([]bait) kepada rentetan dalam Go, ia adalah penting untuk mengendalikan senario di mana jujukan bait tidak boleh ditukar kepada Unicode yang sah rentetan.

Penyelesaian:

1. Semakan Kesahan UTF-8:

Seperti yang dicadangkan oleh Tim Cooper, anda boleh menggunakan fungsi utf8.Valid untuk menentukan sama ada kepingan bait ialah urutan UTF-8 yang sah. Jika utf8.Valid mengembalikan palsu, ia menunjukkan kehadiran bait tidak sah.

2. Pengendalian Bait Bukan UTF-8:

Bertentangan dengan kepercayaan popular, bait bukan UTF-8 masih boleh disimpan dalam rentetan Go. Ini kerana rentetan dalam Go pada asasnya adalah hirisan bait baca sahaja. Ia boleh mengandungi bait UTF-8 yang tidak sah, yang boleh diakses, dicetak atau ditukar kembali kepada kepingan bait tanpa masalah.

Walau bagaimanapun, Go melakukan penyahkodan UTF-8 dalam senario tertentu:

  • Gelung julat: Apabila melelaran pada titik kod Unikod rentetan menggunakan julat gelung, nilai rune yang dikembalikan ialah titik kod Unicode, dengan UTF-8 yang tidak sah digantikan dengan aksara gantian U FFFD (�).
  • Penukaran kepada rune: Menukar rentetan kepada kepingan daripada rune ([]rune) akan menyahkod keseluruhan rentetan, menggantikan UTF-8 yang tidak sah dengan U FFFD.

Nota: Penukaran ini tidak pernah menyebabkan panik, jadi anda hanya perlu menyemak kesahihan UTF-8 secara aktif jika ia penting untuk permohonan anda (mis., jika U FFFD tidak boleh diterima dan ralat harus dibuang).

Sampel Kod:

Kod berikut menunjukkan cara Go mengendalikan kepingan bait yang mengandungi UTF-8 tidak sah:

package main

import "fmt"

func main() {
    a := []byte{0xff} // Invalid UTF-8 byte
    s := string(a)
    fmt.Println(s)       // �
    for _, r := range s { // Range loop replaces invalid UTF-8 with U+FFFD
        fmt.Println(r) // 65533
    }
    rs := []rune(s) // Conversion to runes decodes UTF-8 (U+FFFD)
    fmt.Println(rs)    // [65533]
}

Atas ialah kandungan terperinci Bagaimanakah Go Mengendalikan Urutan Bait Tidak Sah Apabila Menukar kepada Rentetan?. 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