Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Membaca Fail Teks UTF-16 dengan betul sebagai Rentetan dalam Go?

Bagaimanakah Saya Boleh Membaca Fail Teks UTF-16 dengan betul sebagai Rentetan dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-30 13:28:14180semak imbas

How Can I Correctly Read a UTF-16 Text File as a String in Go?

Membaca Fail Teks UTF-16 sebagai Rentetan dalam Go

Memahami Isu

Apabila membaca fail teks UTF-16 ke dalam bait tatasusunan menggunakan kaedah input standard, aksara yang dikodkan UTF-16 fail mungkin tidak ditafsirkan dengan betul. Ini boleh menyebabkan bait dianggap sebagai ASCII, yang membawa kepada perwakilan rentetan yang salah.

Penyelesaian menggunakan Penyahkodan UTF-16

Untuk membaca fail teks UTF-16 dengan betul, adalah penting untuk digunakan kaedah yang direka khusus untuk mengendalikan pengekodan UTF-16. Pakej golang.org/x/text/encoding/unicode menyediakan kefungsian yang diperlukan untuk tujuan ini.

Fungsi ReadFileUTF16()

func ReadFileUTF16(filename string) ([]byte, error) {
    // Read the file into a byte array
    raw, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }

    // Create a transformer that converts MS-Windows default to UTF8
    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)

    // Override the BOM to ensure it is respected
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    // Apply the transformer to the input byte array
    unicodeReader := transform.NewReader(bytes.NewReader(raw), utf16bom)

    // Decode the data into a new byte array
    decoded, err := ioutil.ReadAll(unicodeReader)
    return decoded, err
}

Fungsi NewScannerUTF16()

Untuk senario di mana membaca keseluruhan fail tidak boleh dilaksanakan, fungsi berikut mencipta pengimbas yang menggunakan perkara yang sama Logik penyahkodan UTF-16:

func NewScannerUTF16(filename string) (utfScanner, error) {
    // Read the file into a []byte
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }

    // Create a transformer that converts MS-Windows default to UTF8
    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)

    // Override the BOM to ensure it is respected
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    // Apply the transformer to the input file
    unicodeReader := transform.NewReader(file, utf16bom)
    return unicodeReader, nil
}

Perbincangan tentang BOM dan Sokongan Unikod

Pakej golang.org/x/text/encoding/unicode secara bijak mentafsir Tanda Pesanan Bait (BOM) untuk menentukan pengekodan yang digunakan dalam fail. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa fungsi ReadLine pakej bufio tidak menyokong penyahkod Unikod.

Sumber Lanjut

Untuk penyesuaian dan pilihan tambahan yang berkaitan dengan penyahkodan UTF-16, rujuk sumber terbuka modul di https://github.com/TomOnTime/utfutil/.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membaca Fail Teks UTF-16 dengan betul sebagai Rentetan dalam Go?. 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