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 サイトの他の関連記事を参照してください。