Maison >développement back-end >Golang >Comment lire et analyser correctement les fichiers texte codés en UTF-16 dans Go ?
Lorsqu'il s'agit de fichiers texte codés en UTF-16, le package bufio standard de Go peut ne pas interpréter les caractères Unicode correctement en raison de ses limites dans la gestion des sauts de ligne. Cela peut entraîner des problèmes de conversion du contenu du fichier en chaîne et de préservation des valeurs Unicode prévues.
Une solution consiste à utiliser la dernière version de golang.org/x/text/encoding/unicode, qui introduit l'Unicode. .BOMOverride. Cette fonction détecte intelligemment la marque d'ordre des octets (BOM) et décode le fichier en conséquence :
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) }
Pour gérer l'analyse de texte ligne par ligne, vous pouvez utiliser NewScannerUTF16 :
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) } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!