Heim >Backend-Entwicklung >Golang >Wie liest und analysiert man UTF-16-kodierte Textdateien in Go richtig?

Wie liest und analysiert man UTF-16-kodierte Textdateien in Go richtig?

DDD
DDDOriginal
2024-12-30 21:16:17936Durchsuche

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

So lesen Sie UTF-16-Textdateien in Strings in Go ein

Beim Umgang mit Textdateien, die in UTF-16 codiert sind, interpretiert das Standardpaket bufio von Go möglicherweise keine Unicode-Zeichen korrekt, da die Handhabung von Zeilenumbrüchen eingeschränkt ist. Dies kann zu Problemen bei der Konvertierung des Dateiinhalts in eine Zeichenfolge und der Beibehaltung der beabsichtigten Unicode-Werte führen.

Eine Lösung besteht darin, die neueste Version von golang.org/x/text/encoding/unicode zu verwenden, die Unicode einführt .BOMOverride. Diese Funktion erkennt auf intelligente Weise die Byte Order Mark (BOM) und dekodiert die Datei entsprechend:

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)
}

Für die zeilenweise Textanalyse können Sie NewScannerUTF16 verwenden:

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)
    }
}

Das obige ist der detaillierte Inhalt vonWie liest und analysiert man UTF-16-kodierte Textdateien in Go richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn