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