1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GoでcsvをデコードしようとしたらUTF-8 with BOMになっていて、base64にデコードして文字列にしようとするとエラーが出て困ったことがあるので、その対処法を記載したいと思います。

utf-8 with BOMとは

UTF-8は、Unicode用の符号化形式の1つです。

Unicodeは、符号化文字集合と呼ばれ、世界で使用されている文字に対して、番号が振られたものです。

例えば、には12354という数字が振られています。

その数字を文字に変換するときのルールを符号化形式と呼び、UTF-8では0xe3 0x81 0x82と表されています。

どうして符号化形式が存在するのか

Unicodeは2バイトで1文字を表現します。
しかし、世界には約7000語ほど言語があると言われているらしく、それを2バイトで表現するのは難しかったそうです。
それを解決するためにUTF-8UTF-16という変換形式が生まれたそうです。

UTF-8 with BOMは、UTF-8で書かれていることを示すために、Unicodeの先頭に0xEF 0xBB 0xBFがついたものを指します。

BOMとは

Byte Order Markのことで、unicodeの符号化方式を識別するために先頭に付与される数バイトのデータのことを言います。

対処方法

例えばcsvがbase64エンコードされていたとします。
下のようにcsvをbase64デコードすると、utf-8と認識できずBOM付きの場合エラーを吐きます。

go
decodedCSVBytes, err := base64.StdEncoding.DecodeString(csv)

decodeCSVString := string(decodedCSVBytes)

if !utf8.ValidString(decodeCSVString) {
		if err != nil {
			return nil, err
	}
}

base64とは

文字列を64進数でエンコードします。
エンコードされた文字列はアルファベット(a~z, A~z)と数字(0~9)、一部の記号(+,/)の64文字を使って表されます。(正確には=を使うので65文字らしいです)

この場合は、文字列に変える前にUTF-8 with BOMの先頭の3バイトで識別して下のコードを挿入します。
こうすることでBOMを弾いた内容をデコードすることができます。

go
	if len(decodedCSVBytes) >= 3 && decodedCSVBytes[0] == 0xEF && decodedCSVBytes[1] == 0xBB && decodedCSVBytes[2] == 0xBF {
		decodedCSVBytes = decodedCSVBytes[3:]
	}

utf-8 with BOMを確認する方法

txtファイルであればfileコマンドでfileの形式を確認できます。

zsh
file test.txt

しかし、csvファイルだと確認できないため、下のコマンドで確認します。

zsh
file -e encoding test.csv

BOM付きの場合、下のように表示されます。

zsh
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でのインストール

zsh
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に変換することが可能です。

zsh
nkf --overwrite --oc=UTF-8-BOM test.csv
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?