Apabila bekerja dengan fail Unicode, kehadiran tanda pesanan bait (BOM) boleh memberi kesan kepada penghuraian fail. Walaupun tidak semua fail Unicode mengandungi BOM, adalah penting untuk mengambil kira ini apabila berurusan dengan data merentas platform.
Malangnya, perpustakaan standard Go tidak mempunyai kaedah terbina dalam untuk mengendalikan BOM. Walau bagaimanapun, beberapa pendekatan membolehkan anda menyemak dan memproses fail secara manual dengan BOM.
Menggunakan Pembaca Buffered
Dengan menggunakan pembaca buffer antara strim fail anda dan program panggilan, anda boleh memeriksa beberapa bait pertama dan secara pilihan membuang BOM jika ditemui. Coretan berikut menunjukkan pendekatan ini:
<code class="go">import ( "bufio" "os" "log" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer fd.Close() br := bufio.NewReader(fd) r, _, err := br.ReadRune() if err != nil { log.Fatal(err) } if r != '\uFEFF' { br.UnreadRune() // Not a BOM -- put the rune back } // Now work with br as if you would with fd }</code>
Menggunakan io.Seeker
Sebagai alternatif, anda boleh menggunakan antara muka io.Seeker untuk mencari dalam strim fail. Jika tiga bait pertama bukan BOM, cari kembali ke permulaan.
<code class="go">import ( "os" "log" "io" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer fd.Close() bom := [3]byte _, err = io.ReadFull(fd, bom[:]) if err != nil { log.Fatal(err) } if bom[0] != 0xef || bom[1] != 0xbb || bom[2] != 0xbf { _, err = fd.Seek(0, 0) // Not a BOM -- seek back to the beginning if err != nil { log.Fatal(err) } } // The next read operation on fd will read real data }</code>
Kedua-dua kaedah menganggap fail dikodkan dalam UTF-8. Jika maklumat pengekodan tidak diketahui atau berbeza, pendekatan yang lebih kompleks mungkin diperlukan. Ingat untuk mengendalikan BOM dengan sewajarnya apabila bekerja dengan fail Unicode untuk memastikan penghuraian yang tepat dan integriti data.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Markah Pesanan Bait (BOM) dalam Fail Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!