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
Lepaskan: 2024-12-30 21:16:17
asal
943 orang telah melayarinya

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

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

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!

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