Excel(エクセル)で文字化けしないUTF-8のCSVファイルを出力する方法

4月19日(日) 


Webで受け付けたデータをCSV出力したものの、Excelで開くと文字化けが発生し・・・

こんな時の解決方法について紹介します。

いまのWebサイトは、UTF-8で構築されるのが一般的です。UTF-8で入力されたデータであれば、当然のようにCSVもUTF-8で出力してしまいます。しかし、ExcelでUTF-8のCSVを開くと文字化けが発生してしまいます。

01

Excelのバージョンアップを重ねるごとに、この点が改良されていないか期待したものの、もう何年も、何バージョンもこの状態が続いており、自然と状況が改善されるのは望みが薄そうです。

UTF-8でダウンロードしたCSVをエディタでシフトJISに保存しなおしてからExcelで開くよう、運用でカバーすることもありますが、これだとシフトJISが対応していない文字が化けてしまうリスクがあります。

そもそも多言語のお問い合わせフォームなどを運用している場合には、シフトJISで出力すること自体が自爆行為です。

なお、Excelのインポート機能を利用すれば、UTF-8を始めとした色々な文字コードのデータを正しく取り込めます。たとえば、「00000123」のように8桁の数字で保存されているデータも、CSVで開くと「123」と文字頭にわざわざ入れている「0」がきれいさっぱりなくなってしまいますが、インポート機能を利用して当該データを「文字列」としてインポートしてやれば、文字頭の「0」も忠実に表示されます。

こんなに便利なインポート機能ですが、普段ダブルクリックでファイルを開くことに慣れきっているからか、この方法はあまり好まれない傾向にあります(なんど拒否られたことか・・)

文字化けしないUTF-8のCSV

さて、ちょっと脇に逸れましたが、ここからがようやく本題です。

ダブルクリックで開いても文字化けしない、UTF-8なCSVファイル作成の仕方です。

それは、CSVファイルをBOM付きUTF-8で作成することです。

はい。それだけです。

BOM付き?と思われた方。

BOMとは、Byte Order Markの略で、この内容を見ると、そのファイルがどんな文字コードで保存されているかなどがわかるものです。

Excelでは、このBOMが正しくついている場合、文字コードを認識して、UTF-8でファイルを開いてくれるようです。

一方、BOMが付いていない場合は、シフトJISと解釈して開いてしまうようで、そのため文字化けします。

そもそも、BOM自体が、Unicodeファイルのエンコーディング判別のため設けられた規格なのでExcelの使い方は至極正しいと言えそうです(それでも、BOMが無くとも、自動判別でUTF-8を文字化けなく読み込むようになって欲しいとは思いますが)。

もっとBOMを知りたい方は、wikipediaが参考になります。
バイトオーダーマーク – Wikipedia

普段BOMを意識する必要はないですし、むやみにBOM付きファイルをつくってしまうと、いろいろな不具合の原因になってしまうこともあるとのことで、CSV出力など、限られたケースで使用するテクニックとして覚えればよいように思います。

BOM付きUTF-8のCSVファイル作成方法

では、実際に、BOM付きUTF-8ファイルを作成するにはどうしたらよいか?

ファイルの先頭に EF BB BF という3バイトのバイナリデータを加えるだけです。

はい。こちらもシンプルですね。

具体的には、以下のサンプルコードのような出力をしてやるだけです。

header(‘Content-type: text/csv’);
header(“Content-Disposition: attachment; filename=$filename”);
echo pack(‘C*’,0xEF,0xBB,0xBF);
echo $str;
exit;

ファイルがBOM付きか否かを確認する

では、作成したCSVファイルにBOMが付いているかどうかは、どうやって確認したらよいでしょうか。

BOMは、目に見える文字として表現されないため、ファイルを開いて眺めてみてもBOMが付いているか否かはわかりません。

いくつか判別の方法はありますが、以下の方法が比較的手軽でオススメです。

EmEditorでは、右下のステータスバー上に「BOM付き」の表示が見られます。

03

秀丸エディタでは、ファイル→エンコードの種類からBOM付きの場合はチェックが入っているのがわかります。

04

実際に、この状態のCSVファイルをExcelで開くと以下のようになります。今度は文字化けせずに正しく表示されています!

02

以上、UTF-8なCSVファイルの作り方でした。こういう便利な方法があると、益々CSVを活用する機会が増えそうです。

※今回のCSVに使用したデータ(サンプルデータ)は、下記のサービスを利用させていただきました。

疑似個人情報生成サービス
http://hogehoge.tk/personal/generator/

この記事を書いた人

ITRA開発局
ITRA開発局より現場の情報をお届けします。