Go で UTF-16 テキスト ファイルを読み取るときに、バイトが ASCII として解釈される問題が発生する可能性があります。これは、標準の bufio.NewReader 関数が Unicode を正しく処理しないために発生します。
「golang.org/x」の最新バージョン/text/encoding/unicode」には、デコードする BOM を自動的に検出して解釈する unicode.BOMOverride が導入されています。 UTF-16 が正しく設定されています。 ReadFileUTF16() を使用する例を次に示します。
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 }
この関数は、BOM 付きの UTF-16 ファイルをデコードします。
ファイルがデコードする場合BOM が含まれていない場合は、次のコードを使用できます:
func ReadFileUTF16WithoutBOM(filename string) ([]byte, error) { f, err := os.Open(filename) if err != nil { return nil, err } r := bufio.NewReader(f) // Read past the BOM, if any. var b, e = r.Peek(2) if (b[0] == 0xFF && b[1] == 0xFE) || (b[0] == 0xFE && b[1] == 0xFF) { r.Discard(2) } // Read the rest of the file. decoded, err := ioutil.ReadAll(r) return decoded, err }
This関数は BOM をスキップし、ファイルを UTF-16 として読み取ります。
ReadFileUTF16() または ReadFileUTF16WithoutBOM() を使用すると、BOM と非 BOM の両方の UTF-16 テキストを処理できます。 Go でファイルを作成し、データの正確なデコードと表現を保証します。
以上がBOM エンコーディングと非 BOM エンコーディングの両方を処理しながら、Go で UTF-16 テキスト ファイルを正しく読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。