Closed2
UTF テキストから BOM を抜く
ピン留めされたアイテム
記事にしました。
手元になくてうろ覚えだけど,たしか『実用 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にクローズされました