ホームページ >バックエンド開発 >Golang >Go で UTF-16 でエンコードされたテキスト ファイルを正しく読み取って解析するにはどうすればよいですか?

Go で UTF-16 でエンコードされたテキスト ファイルを正しく読み取って解析するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-30 21:16:17936ブラウズ

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

Go で UTF-16 テキスト ファイルを文字列に読み取る方法

UTF-16 でエンコードされたテキスト ファイルを扱う場合、Go の標準 bufio パッケージは Unicode 文字を解釈できない場合があります改行の処理に制限があるため、正しく実行されません。これにより、ファイルの内容を文字列に変換し、意図した Unicode 値を保持する際に問題が発生する可能性があります。

解決策の 1 つは、Unicode を導入した最新バージョンの golang.org/x/text/encoding/unicode を使用することです。 .BOMオーバーライド。この関数はバイト オーダー マーク (BOM) をインテリジェントに検出し、それに応じてファイルをデコードします:

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)
}

行ごとのテキスト解析を処理するには、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)
    }
}

以上がGo で UTF-16 でエンコードされたテキスト ファイルを正しく読み取って解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。