Go でバイト オーダー マーク (BOM) を含むファイルを読み取る
Unicode ファイルを読み取るときに、バイト オーダー マーク (BOM) が発生する可能性があります。特別な取り扱い。 BOM を手動で確認して破棄する代わりに、Go で BOM を処理するための標準化された方法または推奨される方法はありますか?
BOM を読み取る標準的な方法
コア ライブラリ レベルでは、BOM を特別に処理するために実装された標準化された方法はありません。ただし、標準の Go ライブラリは低レベルの操作の実行に優れており、カスタム BOM 処理メカニズムを簡単に実装できます。
実装例
バッファリングされたオブジェクトの使用リーダー:
バッファ付きリーダーは、BOM を管理するための便利なアプローチを提供します。次の例に示すように、入力ファイル記述子の周囲にバッファー リーダーをラップすることで、BOM を効率的にチェックして破棄できます。
<code class="go">import ( "bufio" "os" "log" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer closeOrDie(fd) 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 you would do with fd // ... }</code>
io.Seeker インターフェイスの使用:
io.Seeker インターフェイスを実装するオブジェクトの場合、別のアプローチとして、ファイルの最初の 3 バイトを読み取り、BOM パターンをチェックします。 BOM が見つからない場合は、以下に示すように、io.Seek() を使用してファイル記述子を先頭に巻き戻すことができます。
<code class="go">import ( "os" "log" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer closeOrDie(fd) 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 でエンコードされていることを前提としていることに注意してください。他のエンコーディングまたは未知のエンコーディングを扱う場合は、さらなるロジックが必要になる場合があります。
以上がGo で Unicode ファイルを読み取るときに、バイト オーダー マーク (BOM) をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。