Unicode ファイルを操作する場合、バイト オーダー マーク (BOM) の存在がファイルの解析に影響を与える可能性があります。すべての Unicode ファイルに BOM が含まれているわけではありませんが、クロスプラットフォーム データを扱う場合はこれらを考慮することが不可欠です。
残念ながら、Go 標準ライブラリには、BOM を実装するための組み込みメソッドがありません。 BOM の処理。ただし、BOM を含むファイルを手動でチェックして処理できる方法がいくつかあります。
バッファー リーダーを使用する
ファイル ストリームと呼び出しプログラムの間にバッファリングされたリーダーを使用すると、最初の数バイトを検査し、見つかった場合はオプションで BOM を破棄できます。次のスニペットは、このアプローチを示しています。
<code class="go">import ( "bufio" "os" "log" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer fd.Close() br := bufio.NewReader(fd) r, _, err := br.ReadRune() if err != nil { log.Fatal(err) } if r != '\uFEFF' { br.UnreadRune() // Not a BOM -- put the rune back } // Now work with br as if you would with fd }</code>
io.Seeker の使用
または、io.Seeker インターフェイスを使用してファイル ストリーム内でシークすることもできます。最初の 3 バイトが BOM ではない場合は、先頭に戻ります。
<code class="go">import ( "os" "log" "io" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer fd.Close() bom := [3]byte _, err = io.ReadFull(fd, bom[:]) if err != nil { log.Fatal(err) } if bom[0] != 0xef || bom[1] != 0xbb || bom[2] != 0xbf { _, err = fd.Seek(0, 0) // Not a BOM -- seek back to the beginning if err != nil { log.Fatal(err) } } // The next read operation on fd will read real data }</code>
どちらの方法も、ファイルが UTF-8 でエンコードされていることを前提としています。エンコード情報が不明であるか、異なる場合は、より複雑なアプローチが必要になる場合があります。 Unicode ファイルを操作するときは、正確な解析とデータの整合性を確保するために、BOM を適切に処理することを忘れないでください。
以上がGo ファイルでバイトオーダー マーク (BOM) を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。