Beim Lesen von UTF-16-Textdateien in Go kann es zu Problemen mit der Interpretation von Bytes als ASCII kommen. Dies liegt daran, dass die Standardfunktion bufio.NewReader Unicode nicht korrekt verarbeitet.
Die neueste Version von „golang.org/x /text/encoding/unicode“ führt unicode.BOMOverride ein, das das BOM automatisch erkennt und interpretiert, um UTF-16 zu dekodieren richtig. Hier ist ein Beispiel mit ReadFileUTF16():
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 }
Diese Funktion dekodiert UTF-16-Dateien mit einer Stückliste.
Wenn Ihre Datei dies tut keine Stückliste enthalten, können Sie den folgenden Code verwenden:
func ReadFileUTF16WithoutBOM(filename string) ([]byte, error) { f, err := os.Open(filename) if err != nil { return nil, err } r := bufio.NewReader(f) // Read past the BOM, if any. var b, e = r.Peek(2) if (b[0] == 0xFF && b[1] == 0xFE) || (b[0] == 0xFE && b[1] == 0xFF) { r.Discard(2) } // Read the rest of the file. decoded, err := ioutil.ReadAll(r) return decoded, err }
Diese Funktion überspringt alle Stücklisten und Lesen Sie die Datei als UTF-16.
Durch die Verwendung von ReadFileUTF16() oder ReadFileUTF16WithoutBOM() können Sie sowohl BOM- als auch Nicht-BOM-UTF-16-Textdateien in Go verarbeiten und so die Genauigkeit gewährleisten Dekodierung und Darstellung Ihrer Daten.
Das obige ist der detaillierte Inhalt vonWie kann ich UTF-16-Textdateien in Go korrekt lesen und dabei sowohl Stücklisten- als auch Nicht-Stücklisten-Kodierungen verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!