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

Comment lire et analyser correctement les fichiers texte codés en UTF-16 dans Go ?

DDD
DDDoriginal
2024-12-30 21:16:17926parcourir

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

Comment lire des fichiers texte UTF-16 dans des chaînes dans Go

Lorsqu'il s'agit de fichiers texte codés en UTF-16, le package bufio standard de Go peut ne pas interpréter les caractères Unicode correctement en raison de ses limites dans la gestion des sauts de ligne. Cela peut entraîner des problèmes de conversion du contenu du fichier en chaîne et de préservation des valeurs Unicode prévues.

Une solution consiste à utiliser la dernière version de golang.org/x/text/encoding/unicode, qui introduit l'Unicode. .BOMOverride. Cette fonction détecte intelligemment la marque d'ordre des octets (BOM) et décode le fichier en conséquence :

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "strings"

    "golang.org/x/text/encoding/unicode"
    "golang.org/x/text/transform"
)

// ReadFileUTF16 is similar to ioutil.ReadFile() but decodes UTF-16.
func ReadFileUTF16(filename string) ([]byte, error) {
    raw, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }

    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    unicodeReader := transform.NewReader(bytes.NewReader(raw), utf16bom)

    decoded, err := ioutil.ReadAll(unicodeReader)
    return decoded, err
}

func main() {
    data, err := ReadFileUTF16("inputfile.txt")
    if err != nil {
        log.Fatal(err)
    }
    final := strings.Replace(string(data), "\r\n", "\n", -1)
    fmt.Println(final)
}

Pour gérer l'analyse de texte ligne par ligne, vous pouvez utiliser NewScannerUTF16 :

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"

    "golang.org/x/text/encoding/unicode"
    "golang.org/x/text/transform"
)

type utfScanner interface {
    Read(p []byte) (n int, err error)
}

// NewScannerUTF16 creates a scanner similar to os.Open() but decodes the file as UTF-16.
func NewScannerUTF16(filename string) (utfScanner, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }

    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    unicodeReader := transform.NewReader(file, utf16bom)
    return unicodeReader, nil
}

func main() {
    s, err := NewScannerUTF16("inputfile.txt")
    if err != nil {
        log.Fatal(err)
    }

    scanner := bufio.NewScanner(s)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading inputfile:", err)
    }
}

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