バイトオーダーマーク (BOM) を含む Unicode ファイルの読み取り
はじめに
Unicode ファイルを扱う場合、BOM (バイト オーダー マーク) の有無を処理することが不可欠です。 Go には、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 } // Continue working with br as you would with fd }</code>
Seeker インターフェイスのアプローチ
io.Seeker インターフェイスを実装するオブジェクト (*os.File など) がある場合、次のことができます。最初の 3 バイトをチェックし、そうでない場合はファイルの先頭までシークバックします。 BOM.
<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) } } // Continue reading real data from fd }</code>
考慮事項
これらの例は、UTF-8 エンコーディングを前提としています。異なるエンコーディングまたはシーク不可能なストリームを処理する必要がある場合は、追加の戦略が必要になる場合があります。
以上がGo で Unicode ファイルのバイト オーダー マーク (BOM) を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。