ホームページ > バックエンド開発 > Golang > Go で Unicode ファイルのバイト オーダー マーク (BOM) を処理する方法は?

Go で Unicode ファイルのバイト オーダー マーク (BOM) を処理する方法は?

DDD
リリース: 2024-11-03 13:28:31
オリジナル
667 人が閲覧しました

How to Handle Byte-Order Marks (BOMs) in Unicode Files in Go?

バイトオーダーマーク (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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート