Apabila membaca fail teks UTF-16 dalam Go, anda mungkin menghadapi masalah dengan bait yang ditafsirkan sebagai ASCII. Ini timbul kerana fungsi bufio.NewReader standard tidak mengendalikan unicode dengan betul.
Versi terkini "golang.org/x /text/encoding/unicode" memperkenalkan unicode.BOMOverride, yang secara automatik mengesan dan mentafsir BOM untuk menyahkod UTF-16 dengan betul. Berikut ialah contoh menggunakan ReadFileUTF16():
func ReadFileUTF16(filename string) ([]byte, error) { raw, err := ioutil.ReadFile(filename) if err != nil { return nil, err } win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) utf16bom := unicode.BOMOverride(win16be.NewDecoder()) unicodeReader := transform.NewReader(bytes.NewReader(raw), utf16bom) decoded, err := ioutil.ReadAll(unicodeReader) return decoded, err }
Fungsi ini akan menyahkod fail UTF-16 dengan BOM.
Jika fail anda melakukannya tidak mengandungi BOM, anda boleh menggunakan kod berikut:
func ReadFileUTF16WithoutBOM(filename string) ([]byte, error) { f, err := os.Open(filename) if err != nil { return nil, err } r := bufio.NewReader(f) // Read past the BOM, if any. var b, e = r.Peek(2) if (b[0] == 0xFF && b[1] == 0xFE) || (b[0] == 0xFE && b[1] == 0xFF) { r.Discard(2) } // Read the rest of the file. decoded, err := ioutil.ReadAll(r) return decoded, err }
Fungsi ini akan melangkau mana-mana BOM dan baca fail sebagai UTF-16.
Dengan menggunakan ReadFileUTF16() atau ReadFileUTF16WithoutBOM(), anda boleh mengendalikan kedua-dua fail teks BOM dan bukan BOM UTF-16 dalam Go, memastikan penyahkodan dan perwakilan data anda dengan tepat.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membaca Fail Teks UTF-16 dengan Betul dalam Go, Mengendalikan Pengekodan BOM dan Bukan BOM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!