ホームページ  >  記事  >  バックエンド開発  >  Go で BOM ありまたは BOM なしの Unicode ファイルを読み取る方法は?

Go で BOM ありまたは BOM なしの Unicode ファイルを読み取る方法は?

DDD
DDDオリジナル
2024-11-07 11:49:03109ブラウズ

How to Read Unicode Files with and Without BOMs in Go?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。