Go で BOM を含むファイルを読み取る
質問:
Unicode ファイルを読み取るにはどうすればよいですか? Go にバイト オーダー マーク (BOM) が含まれているか、または欠如していますか?これを処理するための標準的な方法はありますか?
答え:
Go の標準ライブラリには、BOM 処理のための専用の方法が提供されていません。この機能を自分で実装するための 2 つのアプローチを次に示します。
バッファー リーダー アプローチ:
bufio パッケージは、BOM を処理するための便利なソリューションを提供します。データ ストリームの周囲にバッファー リーダーをラップし、最初のルーンを検査できます。
<code class="go">import ( "bufio" "os" ) func main() { fd, err := os.Open("filename") if err != nil { // Handle error } br := bufio.NewReader(fd) r, _, err := br.ReadRune() if err != nil { // Handle error } if r != '\uFEFF' { br.UnreadRune() // Not a BOM -- put the rune back } }</code>
最初のルーンが BOM でない場合は、期待どおりにバッファー リーダーからの読み取りを続行できます。
Seeker インターフェイスのアプローチ:
io.Seeker インターフェイスを実装するオブジェクト (os.File など) の場合、最初の 3 バイトを直接チェックし、存在する場合は先頭にシークバックできます。 no BOM:
<code class="go">import ( "os" ) func main() { fd, err := os.Open("filename") if err != nil { // Handle error } bom := [3]byte _, err = io.ReadFull(fd, bom[:]) if err != nil { // Handle error } 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 { // Handle error } } }</code>
このアプローチは UTF-8 エンコーディングを前提としていることに注意してください。他のエンコーディングの場合は、より複雑な処理が必要です。
以上がGo で BOM ありまたは BOM なしの Unicode ファイルを読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。