#CSVって便利だよね
Excel等の表計算ソフトにデータをエクスポートしたいとき、.xlsxを作ったりするの、できなくはないけど結構面倒ですよね。だから、CSVで出力したりする。
単に数字やアルファベットだけを取り扱うのなら、
File.WriteAllLines(FileName, CSVData);
みたいな形で書けます。
しかし、CSVDataにASCII以外の文字が入っていると、Excelは正確に認識してくれません。
UTF-8で書き出しているはずなのですが、ShiftJISとして読んだ結果文字化けします。
(Excelから開くことはできますが、CSVの関連付けで開くと文字化けします)
さて、解決方法です。日本語版のExcelですと、デフォルトはShiftJISとして認識します。一方、英語版だとANSIで認識します。一方、BOM付きのUTF-8で書き出すとExcelはちゃんと認識してくれて、UTF-8として読み込んでくれます。
BOMがついていない場合はデフォルトのコードページで、BOMがついている場合BOMに応じて読み込むそうです。
#UTF-8(BOM)付きで書き出す方法
あれ?と思うかもしれません。
確かに、File.WriteAllLinesには、Encoding引き数があります。しかし、デフォルトでUTF-8(BOM無し)で書き込むわけで、Encode引数指定なしでの書き出しはEncodingにEncoding.Text.UTF8Encodingを指定した書き出しが実行される様に思うじゃないですか。
そう、そんな風に考えていたことが私にもありました。
実はMicrosoftのサイトにはこういうことが書いてあります。
メソッドの既定の動作で WriteAllLines は、バイトオーダーマーク (BOM) なしで utf-8 エンコーディングを使用してデータを書き出します。 ファイルの先頭に UTF-8 識別子 (バイトオーダーマークなど) を含める必要がある場合は、 WriteAllLines(String, String[], Encoding) エンコードでメソッドオーバーロードを使用し UTF8 ます。
System.IO.File.WriteAllLines
そう、Encoding.Text.UTF8Encoding指定とEncoding指定なしのメソッドは動作が違います。
そうです。
File.WriteAllLines(FileName, CSVData、Encoding.Text.UTF8Encoding);
が正しいのです。これで、Excelがちゃんと文字コードを認識して読み込んでくれます。めでたしめでたし。