2022.05.19  

【Go】csvファイルをExcelで開いたとき文字化けしないようにする

Go    

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)を指定します。フラグを複数指定する場合は「 | 」で区切ります。
第三引数はファイルパーミッションを指定します。

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信