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

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

Linda Hamilton
Linda HamiltonOriginal
2024-12-20 17:42:10499Durchsuche

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

So lesen Sie UTF-16-Textdateien in Go

Das Problem verstehen

Viele Dateiformate kodieren Textdaten mithilfe der UTF-16-Kodierung, einer Zwei-Byte-Unicode-Kodierung. Wenn Sie eine UTF-16-Datei in Go lesen, ist es wichtig, die Bytes richtig zu dekodieren, um den tatsächlichen Textinhalt zu erhalten. Das Standardverhalten in Go besteht jedoch darin, UTF-16-Bytes als ASCII zu behandeln, was zu falschen Ergebnissen führen kann.

Dekodierung von UTF-16-Dateien

Zum Lesen von a Um die UTF-16-Datei korrekt zu laden, müssen Sie beim Lesen der Datei die Kodierung angeben. Go stellt hierfür den unicode.UTF16-Decoder zur Verfügung. Hier ist eine aktualisierte Version des von Ihnen bereitgestellten Codes:

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

Dieser Code verwendet unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), um einen Decoder für UTF-16 mit Big-Endian-Bytereihenfolge zu erstellen Ignorieren jeglicher Byte Order Mark (BOM). Die Stückliste wird verwendet, um die Byte-Reihenfolge der Datei anzugeben, aber da wir sie ignorieren, funktioniert der Code unabhängig von der Stückliste korrekt.

Die dekodierten Bytes werden dann mit der Funktion string() in einen String umgewandelt . Schließlich werden alle Zeilenenden im Windows-Stil mit strings.Replace() entfernt.

Neuen Scanner für UTF-16-Dateien verwenden

Wenn Sie die Datei lesen müssen Zeile für Zeile können Sie anstelle von ioutil.ReadFile die Funktion New ScannerUTF16 aus dem Paket golang.org/x/text verwenden. Hier ist ein Beispiel:

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

Dieser Code verwendet die Funktion bufio.NewScanner(), um einen Scanner zu erstellen, der vom transformierten Reader liest, der die UTF-16-Bytes dekodiert. Mithilfe eines Scanners können Sie die Zeilen der Datei durchlaufen, ohne die gesamte Datei in den Speicher einlesen zu müssen.

Das obige ist der detaillierte Inhalt vonWie liest und dekodiert man UTF-16-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