Go で Unicode ファイルを読み取るときに、バイト オーダー マーク (BOM) をどのように処理しますか?

Susan Sarandon
リリース: 2024-11-04 02:57:30
オリジナル
996 人が閲覧しました

How do you handle Byte Order Marks (BOMs) when reading Unicode files in Go?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!