Closed2

UTF テキストから BOM を抜く

SpiegelSpiegel

手元になくてうろ覚えだけど,たしか『実用 Go言語』に載ってた UTF エンコーディングなテキストから BOM (Byte Order Mark) を抜く方法。

package main

import (
    "fmt"
    "io"
    "strings"

    "github.com/dimchansky/utfbom"
)

const text = "\xEF\xBB\xBFhello"

func main() {
    fmt.Println([]byte(text))
    r, enc := utfbom.Skip(strings.NewReader(text))
    fmt.Println("Encoding:", enc)
    b, err := io.ReadAll(r)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(b)
}

これを動かすとこんな感じに出力される。

[239 187 191 104 101 108 108 111]
Encoding: UTF8
[104 101 108 108 111]

うんうん。ちゃんと BOM が外れてるね。あらかじめエンコーディングが分かっている場合は utfbom.Skip() 関数の代わりに

 r := utfbom.SkipOnly(strings.NewReader(text))

でもOK。いわゆる Decorator Pattern というやつですな。

これの何がうれしいかというと,巨大 CSV ファイルなどを読み込む際に BOM の有無を考えずに1レコードずつ順次アクセスできるのですよ。ただし github.com/dimchansky/utfbom パッケージでは先頭の BOM しか除去してくれないので,先頭以外の場所に紛れている BOM はそのまま出力される。

このスクラップは2022/10/29にクローズされました