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

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

DDD
DDDasal
2024-12-30 21:16:17936semak imbas

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

Cara Membaca Fail Teks UTF-16 ke dalam Rentetan dalam Go

Apabila berurusan dengan fail teks yang dikodkan dalam UTF-16, pakej bufio standard Go mungkin tidak mentafsir aksara Unicode dengan betul kerana batasannya dalam mengendalikan pemutus talian. Ini boleh membawa kepada isu dengan menukar kandungan fail kepada rentetan dan mengekalkan nilai Unikod yang dimaksudkan.

Satu penyelesaian ialah menggunakan versi terkini golang.org/x/text/encoding/unicode, yang memperkenalkan unicode .BOMOverride. Fungsi ini secara bijak mengesan tanda pesanan bait (BOM) dan menyahkod fail dengan sewajarnya:

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "strings"

    "golang.org/x/text/encoding/unicode"
    "golang.org/x/text/transform"
)

// ReadFileUTF16 is similar to ioutil.ReadFile() but decodes UTF-16.
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
}

func main() {
    data, err := ReadFileUTF16("inputfile.txt")
    if err != nil {
        log.Fatal(err)
    }
    final := strings.Replace(string(data), "\r\n", "\n", -1)
    fmt.Println(final)
}

Untuk mengendalikan penghuraian teks baris demi baris, anda boleh menggunakan NewScannerUTF16:

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"

    "golang.org/x/text/encoding/unicode"
    "golang.org/x/text/transform"
)

type utfScanner interface {
    Read(p []byte) (n int, err error)
}

// NewScannerUTF16 creates a scanner similar to os.Open() but decodes the file as UTF-16.
func NewScannerUTF16(filename string) (utfScanner, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }

    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    unicodeReader := transform.NewReader(file, utf16bom)
    return unicodeReader, nil
}

func main() {
    s, err := NewScannerUTF16("inputfile.txt")
    if err != nil {
        log.Fatal(err)
    }

    scanner := bufio.NewScanner(s)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading inputfile:", err)
    }
}

Atas ialah kandungan terperinci Bagaimana untuk Membaca dan Menghuraikan Fail Teks Berkod UTF-16 dengan betul 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