こんにちは!皆さん、CSV出力してますか?
業務系のシステム開発をしているとデータをCSVで出力できるようにしてほしいという要望が良くありますよね。その時に毎度出てくる問題がエンコードと文字化けの問題です。
CSVファイルをエクセルで開いたら文字化け…。誰もが一度は経験したことがあると思います。

ご承知の通り上の例はCSVファイルのエンコードがShiftJISでなかったときに起きるものです。
そのため古くから「CSV出力を要望されたらとりあえずShiftJISに変換して出力しておく」というのが定番でした。しかし最近では少し事情が変わってきているようです。
今回は、CSVファイルの新定番「BOM付きUTF-8」について考えてみたいと思います。
何故ShiftJISが使われてきたか
そもそもなぜShiftJISなのでしょう。
理由はシンプルです。エクセルがUTF-8をうまく扱えなかったからです。
歴史的な背景としては、古くからWindows系のシステムで日本語を扱うときはShiftJISが標準的でした。そのため当時からMicrosoftのエクセルにおいてもCSVファイルはShiftJISが採用されています。エクセルは業務で使うソフトウェアの代表格なので、必然的に業務系システムで出力するCSVもそれに合わせてShiftJISで出力するのが定番、というシンプルな理由です。
最近は事情が変わってきた
近年では少し状況が変わってきており、CSV出力にUTF-8を採用する事も増えてきています。
背景として次のような理由があります
- データベースがUTF-8前提である事が多い
- 文字コード変換による不具合や手間を避けたい
- 多言語対応の必要性が高まっている
- エクセル自体の対応が進んだ
特に最後のエクセルの進化が今回の記事の大きなポイントとなります。
エクセルがひそかに進化
世の中、便利な方が良いに決まっています。エクセルも少しずつ進化しています。
エクセルはShiftJISしか使えないというわけではなく、徐々に機能面の改善がされています。UTF-8のCSVを読み込む方法のひとつに「データ取込」機能が用意されました。これを使えばUTF-8のCSVファイルも読み込むことが出来ます。ただ使い勝手はあまり良いものとは言えませんでした。いちいちメニューから機能を選んで読み込みのエンコードとフォーマットを設定して読み込む必要があるため面倒ですし、いつもの調子でダブルクリックしてCSVファイルを開いてしまったら、ShiftJISで読み込まれて文字化け、という事が起きていました。
データ > テキストまたはCSVから
読み込み結果。UTF-8も読み込めるが、正直操作がめんどくさい。フィルタやスタイルが勝手につくのが邪魔な場合も。
そこで登場するのが「BOM付きUTF-8」です。
近年のエクセルではこれが少し改善されていて、UTF-8を自動判別できるようになっています。Excel 2016以降やOffice365では、BOM付きUTF-8であればダブルクリックで文字化けせずに開くことが出来るようになっています。

BOM付きUTF-8とは
BOMとは「Byte Order Mark」の略で、Unicodeの符号化方式※の種類を判別するために付ける目印の事で、Unicodeデータの先頭に付ける数バイトのバイナリです。
またBOMは省略される事もあり、Unicodeデータに必ず付いているというものではありません。
※ UTF-8もunicodeの中の符号化方式の1つで、他にはUTF-16BE、UTF-16LE、 UTF-32BE、UTF-32LEなど様々な符号化方式があります。
BOMの中身
バイナリエディタでBOM付きUTF-8のファイルを開くと最初の3バイトにBOMが付いていることが確認できます。
元ファイルの例
バイナリ(BOMなしの場合 )
バイナリ(BOMありの場合)
UTF-8のBOMは、0xEF 0xBB 0xBFです。
近年のエクセルにおいてはこのBOMが付いている事でCSVファイルが自動でUTF-8と判断されるため、ダブルクリックでファイルを開いたときも文字化けすることなく正常に開けるようになりました。また、エクセルでファイル保存するときはファイル種類で「CSV UTF-8(コンマ区切り)(*.csv)」を選択して保存するとUTF-8で保存されてファイルにはBOMが付いています。
BOM付きUTF-8のメリットと注意点
メリット
- エクセルでそのままダブルクリックで開ける
- 文字化けしない
- データベースからエンコード変換が不要
- エクセルからのCSV保存も「CSV UTF-8(コンマ区切り)(*.csv) 」を選択するだけ
つまり、利用者のユーザー体験を損ねることなく、開発者をデータ変換や文字化け対策で悩ませる事もなくなるので、WIN x WINです。
ただし注意点も
一方で、BOMには注意点もあります。
- BOMを判別しないソフトウェアでは余計なバイナリデータが付いているように見える
- ヘッダーなどCSVのパースに失敗する場合がある
そのため全てのケースに万能というわけではありません。
BOM付きUTF-8はCSV出力の新定番となりうるか
正直、ケースバイケースだと思います。(う、弱いな・・・)
しかし、業務システムにおいてCSVファイル出力は大抵の場合エクセルでの利用を前提にしたものである事が多いです。その場合は迷わず「BOM付きUTF-8」を採用しましょう。ShiftJISを採用する理由がほぼ無いので「BOM付きUTF-8」は新定番と言えると思います。
逆にシステム間連携などが想定されているCSVであれば慎重に検討するべきです。相手側がBOMによって誤動作することがあり、そもそもShiftJISしか受け取れないシステムも数多くあります。
大事なのはシステムがどのような使われ方を想定しているかです、
「CSV出力=とりあえずShiftJIS」から一歩踏み出して用途に応じた最適解を設計に反映するようにしましょう。

