UTF-8を使って作成したCSVをExcelで開くと文字化けする問題

Programing,文字コード

UTF-8を使って書き出したCSVファイルをExcelで開くと文字化けしてしまいました。

この問題について解説します。

デフォルトはShift-JIS

ExcelCSVを開くと、デフォルトでは文字コードはShift-JISになってます。
試しにExcel
f:id:tsubakurame-1913:20210512134548p:plain
こんな感じのデータをCSVで保存して、バイナリエディタから確認してみます。

f:id:tsubakurame-1913:20210512134330p:plain
エンコードをShift-JISにした時に正しく読み取れました。

なので、基本的にExcelCSVファイルを開くときはShift-JISで開こうとします。
ですが、UTF-8で開くこともできます。
というか、Excelの保存ダイアログに
f:id:tsubakurame-1913:20210512134755p:plain
CSV(コンマ区切り)とCSV UTF-8(コンマ区切り)が存在しているので
UTF-8で保存はできるんです。

ではどうやってShift-JISとUTF-8を切り替えているのかというと、BOMがついているからです。

BOMとは

BOMとはbyte order markの略でUnicodeで符号化したテキストの先頭に付与される数バイトのデータのことです。
これがあるかないかでExcelエンコードを決めています。

ためしにさっきと同じデータをCSV UTF-8で保存してバイナリエディタから見てみると
f:id:tsubakurame-1913:20210512135117p:plain
こうなっています。
0xE5A3B1が「壱」なので、先頭に0xEF 0xBB 0xBFが余分に付与されているのがわかります。
これがUTF-8のBOMです。
UTF-16の場合はビッグエンディアンの時0xFE 0xFFで、リトルエンディアンの時0xFF 0xFEとなります。
他のUnicodeテキストのBOMはWikipedia先生を見てください。

バイト順マーク – Wikipedia

つまり、UnicodeCSVを書き出した時にExcelで正しく表示するには先頭にBOMをちゃんと付けましょう。
という話でした。