Heim >Backend-Entwicklung >Golang >Wie liest und analysiert man UTF-16-kodierte Textdateien in Go richtig?
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!