Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Membaca dan Menyahkod Fail Teks UTF-16 dengan betul dalam Go?

Bagaimana untuk Membaca dan Menyahkod Fail Teks UTF-16 dengan betul dalam Go?

Linda Hamilton
Lepaskan: 2024-12-20 17:42:10
asal
496 orang telah melayarinya

How to Correctly Read and Decode UTF-16 Text Files in Go?

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)
}
Salin selepas log masuk

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())
    }
}
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan