Lors de la lecture d'un fichier texte UTF-16 dans un octet tableau à l'aide de méthodes de saisie standard, les caractères codés en UTF-16 du fichier risquent de ne pas être interprétés correctement. Cela peut entraîner le traitement des octets en ASCII, conduisant à des représentations de chaîne incorrectes.
Pour lire correctement un fichier texte UTF-16, il est crucial d'utiliser méthodes spécifiquement conçues pour gérer l’encodage UTF-16. Le package golang.org/x/text/encoding/unicode fournit les fonctionnalités nécessaires à cet effet.
func ReadFileUTF16(filename string) ([]byte, error) { // Read the file into a byte array raw, err := ioutil.ReadFile(filename) if err != nil { return nil, err } // Create a transformer that converts MS-Windows default to UTF8 win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) // Override the BOM to ensure it is respected utf16bom := unicode.BOMOverride(win16be.NewDecoder()) // Apply the transformer to the input byte array unicodeReader := transform.NewReader(bytes.NewReader(raw), utf16bom) // Decode the data into a new byte array decoded, err := ioutil.ReadAll(unicodeReader) return decoded, err }
Pour les scénarios où la lecture de l'intégralité du fichier n'est pas réalisable, la fonction suivante crée un scanner qui utilise le même décodage UTF-16 logique :
func NewScannerUTF16(filename string) (utfScanner, error) { // Read the file into a []byte file, err := os.Open(filename) if err != nil { return nil, err } // Create a transformer that converts MS-Windows default to UTF8 win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) // Override the BOM to ensure it is respected utf16bom := unicode.BOMOverride(win16be.NewDecoder()) // Apply the transformer to the input file unicodeReader := transform.NewReader(file, utf16bom) return unicodeReader, nil }
Le package golang.org/x/text/encoding/unicode interprète intelligemment les marques d'ordre d'octet (BOM) pour déterminer l'encodage utilisé dans le fichier. Cependant, il est important de noter que la fonction ReadLine du package bufio ne prend pas en charge le décodage Unicode.
Pour une personnalisation supplémentaire et des options liées au décodage UTF-16, reportez-vous à l'open source module sur https://github.com/TomOnTime/utfutil/.
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!