Goで作成したcsvファイルを、Excelで文字化けさせないようにする方法をメモ書きします。
方法としては作成したcsvファイルの先頭に、BOM付きUTF8を付与します。
下記コードではbw.Write([]byte{0xEF, 0xBB, 0xBF})
の部分でそれをおこなっています。
package main
import (
"bufio"
"encoding/csv"
"log"
"os"
)
func main() {
// ファイルを開く
file, err := os.OpenFile("new_company.csv", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
log.Fatal(err)
}
// Excelで文字化けしないようにする設定。BOM付きUTF8をfileの先頭に付与。
bw := bufio.NewWriter(file)
bw.Write([]byte{0xEF, 0xBB, 0xBF})
// csvデータ
records := [][]string{
{"No", "name", "age"},
{"1", "sato", "15"},
{"2", "kato", "25"},
{"3", "mato", "37"},
}
// csvファイルにデータを書き込む
w := csv.NewWriter(bw)
w.WriteAll(records)
if err := w.Error(); err != nil {
log.Fatal(err)
}
// fileを閉じる。
if err := file.Close(); err != nil {
log.Fatal(err)
}
}
コード実行後のcsvファイルの中身
No,name,age
1,sato,15
2,kato,25
3,mato,37
BOM付きUTF-8とは
BOMとは
BOM
とはバイトオーダーマーク(byte order mark)の略で、Unicodeで符号化したテキストの先頭に付与される数バイトのデータのことです。BOM付きUTF-8とは:引用元
Unicodeとは
Unicode
とは世界中のあらゆる文字をとりあえず16進数の数字(コードポイント)に割り振った表のこと。
→ 「あ」のコードポイントは「3042」
UTF-8とは
UTF-8
とは Unicodeで割り振ったコードポイントをパソコンがわかるように別の16進数の数字(符号)に変換する方法の1つ。「コードポイント → 符号」に変換する。
→ コードポイント「3042」をUTF-8で符号に変換すると「E38182」(16進数)
UnicodeとUTF-8の違い
Unicodeのコードポイントをそのままパソコンに理解させるよりもUTF-8などによる符号を使う方がバイト削減できるため、UTF-8で符号化しているらしい。※
※ Unicodeコードだと世界中の全ての言語を保持しているためコードポイントが4バイトになってしまう。UTF-8でアルファベットを扱う場合は1バイト、ひらがなは3バイトとなる。-UnicodeとUTF-8の違い:引用元
BOM付きUTF-8の利用
プログラムがテキストデータを読み込む際に、先頭の数バイトによりUnicodeのデータであることや、どの種類の符号化形式を採用しているのかを判別しています。
BOM付きのUTF-8であれば先頭の3バイトがBOMであり、0xEF 0xBB 0xBF
というデータになります。
CSVファイルにBOM付きUTF-8を付与する理由
「エクセル」は特に指定がない場合「Shift-JIS」という文字コードでデータを読み込むようになっています。CSVファイルを文字化けさせずにエクセルで開く:引用元
BOM付きUTF-8をCSVファイルの先頭に付与することで、Excelが対象CSVファイルを「UTF-8」として文字コードを認識してくれるため、文字化けがおこならなくなります。
os.OpenFile
第一引数には、ファイル名を指定します。
第二引数には、フラグです。
読み込みと書き込み両方を行う設定(os.O_RDWR)と、第一引数で指定したファイルがなければ作成する(os.O_CREATE)を指定します。フラグを複数指定する場合は「 | 」で区切ります。
第三引数はファイルパーミッションを指定します。