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
Libérer: 2024-12-30 13:28:14
original
171 Les gens l'ont consulté

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
}
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal