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!