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

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

Linda Hamilton
リリース: 2024-12-20 17:42:10
オリジナル
495 人が閲覧しました

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

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

問題を理解する

多くファイル形式は、2 バイトの Unicode である UTF-16 エンコーディングを使用してテキスト データをエンコードします。エンコーディング。 Go で UTF-16 ファイルを読み取る場合は、バイトを正しくデコードして実際のテキスト コンテンツを取得することが重要です。ただし、Go のデフォルトの動作では、UTF-16 バイトを ASCII として扱うため、誤った結果が生じる可能性があります。

UTF-16 ファイルのデコード

ファイルを読み取るにはUTF-16 ファイルを正しく読み込むには、ファイルを読み取るときにエンコードを指定する必要があります。 Go は、この目的のために unicode.UTF16 デコーダーを提供します。提供したコードの更新バージョンは次のとおりです。

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)
}
ログイン後にコピー

このコードは、unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) を使用して、ビッグ エンディアンのバイト オーダーを持つ UTF-16 のデコーダーを作成し、バイト オーダー マーク (BOM) は無視されます。 BOM はファイルのバイト順序を示すために使用されますが、BOM を無視するため、コードは BOM に関係なく正しく動作します。

デコードされたバイトは、string() 関数を使用して文字列に変換されます。 。最後に、Windows スタイルの行末は strings.Replace() を使用して削除されます。

UTF-16 ファイルに新しいスキャナーを使用する

ファイルを読み取る必要がある場合1 行ずつ、ioutil.ReadFile の代わりに golang.org/x/text パッケージの New ScannerUTF16 関数を使用できます。以下に例を示します。

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())
    }
}
ログイン後にコピー

このコードは、bufio.NewScanner() 関数を使用して、変換されたリーダーから読み取り、UTF-16 バイトをデコードするスキャナーを作成します。スキャナーを使用すると、ファイル全体をメモリに読み込まなくても、ファイルの行を反復処理できます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート