Comment lire des fichiers texte UTF-16 dans Go
Comprendre le problème
Beaucoup Les formats de fichiers codent les données textuelles à l'aide du codage UTF-16, qui est un codage Unicode sur deux octets. Lorsque vous lisez un fichier UTF-16 dans Go, il est important de décoder correctement les octets pour obtenir le contenu textuel réel. Cependant, le comportement par défaut dans Go consiste à traiter les octets UTF-16 comme ASCII, ce qui peut conduire à des résultats incorrects.
Décodage des fichiers UTF-16
Pour lire un Fichier UTF-16 correctement, vous devez spécifier l'encodage lors de la lecture du fichier. Go fournit le décodeur unicode.UTF16 à cet effet. Voici une version mise à jour du code que vous avez fourni :
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) }
Ce code utilise unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) pour créer un décodeur pour UTF-16 avec un ordre d'octets big-endian et en ignorant toute marque d'ordre d'octet (BOM). La BOM est utilisée pour indiquer l'ordre des octets du fichier, mais comme on l'ignore, le code fonctionnera correctement quelle que soit la BOM.
Les octets décodés sont ensuite convertis en chaîne à l'aide de la fonction string() . Enfin, toutes les fins de ligne de style Windows sont supprimées à l'aide de strings.Replace().
Utilisation du nouveau scanner pour les fichiers UTF-16
Si vous devez lire le fichier ligne par ligne, vous pouvez utiliser la fonction New ScannerUTF16 du package golang.org/x/text au lieu de ioutil.ReadFile. Voici un exemple :
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()) } }
Ce code utilise la fonction bufio.NewScanner() pour créer un scanner qui lit à partir du lecteur transformé, qui décode les octets UTF-16. En utilisant un scanner, vous pouvez parcourir les lignes du fichier sans avoir à lire l'intégralité du fichier en mémoire.
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!