Maison >développement back-end >Golang >Comment puis-je lire correctement un fichier texte UTF-16 sous forme de chaîne dans Go ?

Comment puis-je lire correctement un fichier texte UTF-16 sous forme de chaîne dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-30 13:28:14175parcourir

How Can I Correctly Read a UTF-16 Text File as a String in Go?

Lecture d'un fichier texte UTF-16 sous forme de chaîne dans Go

Comprendre le problème

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.

Solution utilisant le décodage UTF-16

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.

Fonction ReadFileUTF16()

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
}

Fonction NewScannerUTF16()

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
}

Discussion sur la prise en charge de la nomenclature et d'Unicode

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.

Ressources supplémentaires

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn