GoでcsvをデコードしようとしたらUTF-8 with BOM
になっていて、base64にデコードして文字列にしようとするとエラーが出て困ったことがあるので、その対処法を記載したいと思います。
utf-8 with BOMとは
UTF-8
は、Unicode用の符号化形式の1つです。
Unicode
は、符号化文字集合と呼ばれ、世界で使用されている文字に対して、番号が振られたものです。
例えば、あ
には12354という数字が振られています。
その数字を文字に変換するときのルールを符号化形式と呼び、UTF-8
では0xe3 0x81 0x82と表されています。
UTF-8 with BOM
は、UTF-8で書かれていることを示すために、Unicodeの先頭に0xEF 0xBB 0xBF
がついたものを指します。
対処方法
例えばcsvがbase64エンコードされていたとします。
下のようにcsvをbase64デコードすると、utf-8
と認識できずBOM付きの場合エラーを吐きます。
decodedCSVBytes, err := base64.StdEncoding.DecodeString(csv)
decodeCSVString := string(decodedCSVBytes)
if !utf8.ValidString(decodeCSVString) {
if err != nil {
return nil, err
}
}
この場合は、文字列に変える前にUTF-8 with BOM
の先頭の3バイトで識別して下のコードを挿入します。
こうすることでBOMを弾いた内容をデコードすることができます。
if len(decodedCSVBytes) >= 3 && decodedCSVBytes[0] == 0xEF && decodedCSVBytes[1] == 0xBB && decodedCSVBytes[2] == 0xBF {
decodedCSVBytes = decodedCSVBytes[3:]
}
utf-8 with BOMを確認する方法
txtファイルであればfileコマンドでfileの形式を確認できます。
file test.txt
しかし、csvファイルだと確認できないため、下のコマンドで確認します。
file -e encoding test.csv
BOM付きの場合、下のように表示されます。
test.csv: Unicode text, UTF-8 (with BOM) text
UTF-8 with BOMを作成する方法
テストでUTF-8 with BOMを作成する必要がある場合は、nkf
コマンドを使います。
nfkは「Network Kanji Filter」の略で、文字コードを変換することができ、異なるOS間でのファイル共有を可能にするコマンドです。
nkfコマンドは最初から入っているものではないのでインストールしてください。
-
windows
nkf.exe
をインストールしてパスを通してください。 -
Mac
homebrewでのインストール
brew install nkf
参考:https://neos21.net/blog/2018/04/10-01.html#windows-%E3%81%AE%E5%A0%B4%E5%90%88
下のコマンドを使うことでUTF-8 with BOMに変換することが可能です。
nkf --overwrite --oc=UTF-8-BOM test.csv