Cara Membaca Fail Teks UTF-16 dalam Go
Memahami Masalah
Banyak format fail mengekod data teks menggunakan pengekodan UTF-16, iaitu pengekodan Unicode dua bait. Apabila anda membaca fail UTF-16 dalam Go, adalah penting untuk menyahkod bait dengan betul untuk mendapatkan kandungan teks sebenar. Walau bagaimanapun, tingkah laku lalai dalam Go adalah untuk menganggap UTF-16 bait sebagai ASCII, yang boleh membawa kepada hasil yang salah.
Menyahkod Fail UTF-16
Untuk membaca UTF-16 dengan betul, anda perlu menentukan pengekodan semasa membaca fail. Go menyediakan penyahkod unicode.UTF16 untuk tujuan ini. Berikut ialah versi terkini kod yang anda berikan:
package main import ( "bytes" "fmt" "io/ioutil" "os" "strings" "golang.org/x/text/encoding/unicode" ) func main() { // Read the file into a []byte raw, err := ioutil.ReadFile("test.txt") if err != nil { fmt.Printf("error opening file: %v\n", err) os.Exit(1) } // Create a Unicode UTF-16 decoder utf16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) // Create a transformer to decode the data transformer := utf16be.NewDecoder() // Decode the text using the transformer decoded, err := transformer.Bytes(raw) if err != nil { fmt.Printf("error decoding file: %v\n", err) os.Exit(1) } // Convert the decoded bytes to a string text := string(decoded) // Remove any Windows-style line endings (CR+LF) final := strings.Replace(text, "\r\n", "\n", -1) // Print the final text fmt.Println(final) }
Kod ini menggunakan unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) untuk mencipta penyahkod untuk UTF-16 dengan susunan bait besar-endian dan mengabaikan sebarang Tanda Pesanan Bait (BOM). BOM digunakan untuk menunjukkan susunan bait fail, tetapi kerana kita mengabaikannya, kod akan berfungsi dengan betul tanpa mengira BOM.
Bait yang dinyahkod kemudian ditukar kepada rentetan menggunakan fungsi string() . Akhir sekali, sebarang pengakhiran baris gaya Windows dialih keluar menggunakan rentetan. Ganti().
Menggunakan Pengimbas Baharu untuk Fail UTF-16
Jika anda perlu membaca fail baris demi baris, anda boleh menggunakan fungsi New ScannerUTF16 daripada pakej golang.org/x/text dan bukannya ioutil.ReadFile. Berikut ialah contoh:
package main import ( "bufio" "fmt" "os" "golang.org/x/text/encoding/unicode" "golang.org/x/text/transform" ) func NewScannerUTF16(filename string) (*bufio.Scanner, error) { // Read the file into a []byte raw, err := os.ReadFile(filename) if err != nil { return nil, err } // Create a Unicode UTF-16 decoder utf16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) // Create a transformer to decode the data transformer := utf16be.NewDecoder() // Create a scanner that uses the transformer scanner := bufio.NewScanner(transform.NewReader(bytes.NewReader(raw), transformer)) return scanner, nil } func main() { // Create a scanner for the UTF-16 file scanner, err := NewScannerUTF16("test.txt") if err != nil { fmt.Printf("error opening file: %v\n", err) os.Exit(1) } // Read the file line by line for scanner.Scan() { fmt.Println(scanner.Text()) } }
Kod ini menggunakan fungsi bufio.NewScanner() untuk mencipta pengimbas yang membaca daripada pembaca yang diubah, yang menyahkod UTF-16 bait. Dengan menggunakan pengimbas, anda boleh mengulangi baris fail tanpa perlu membaca keseluruhan fail ke dalam ingatan.
Atas ialah kandungan terperinci Bagaimana untuk Membaca dan Menyahkod Fail Teks UTF-16 dengan betul dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!