Maison >développement back-end >Golang >Comment lire et décoder correctement les fichiers texte UTF-16 dans Go ?

Comment lire et décoder correctement les fichiers texte UTF-16 dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-20 17:42:10499parcourir

How to Correctly Read and Decode UTF-16 Text Files in Go?

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!

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