CSVの文字化けを直す
届いたCSVを開いたら 譌・譛ャ闌カ のような文字が並んでいた。あるいは自分が送ったCSVについて「開いたら化けていました」と言われた——原因はCSVという形式そのものにあります。そして、「正しい文字コードで保存する」という解決策は存在しません。理由が分かると、どちらに転んでも化けない作り方が1つに決まります。作業はブラウザの中だけで完結し、ファイルはどこにも送信されません。
先に道具を見るなら——CSV Excel 変換/サンプルで試す
CSVには「何で書いたか」を記録する欄がありません
日本語を数字の並びで表す方式を文字コードといい、広く使われているものが2つあります。UTF-8(世界共通・現在の標準)とShift_JIS(日本語Windowsで長く使われてきた方式)です。同じ「日本」という文字でも、この2つではファイルに入るバイトが違います。
ところがCSVは、文字を区切って並べただけの単純な形式で、どちらで書いたかを記録する場所がありません。そのため開く側は中身から推測して読むしかなく、推測を外した瞬間に化けます。
これはZIPのファイル名が化ける問題とまったく同じ構造です。ZIPも初期の仕様に文字コードの欄が無く、あとから「これはUTF-8です」と宣言する印が追加されました。CSVにも、同じ役割を果たす印があります。
「正しい文字コード」は存在しません(実測)
同じ内容のCSVを3通りの文字コードで作り、開いて比べました。機種依存文字(① と ㈱)も意図的に入れてあります。
| 開く側 | UTF-8(BOMなし) | BOM付きUTF-8 | Shift_JIS |
|---|---|---|---|
| LibreOffice Calc 実測 | 正常 | 正常 | 化ける |
| ハルオフィス 実測 | 正常 | 正常 | 正常 |
| Excel(日本語Windows) 仕組みから | 化ける | 正常 | 正常 |
LibreOfficeではShift_JISが化け、日本語WindowsのExcelでは逆にUTF-8が化けます。ファイルが間違っているのではありません。開く側が何を想定しているかで、化ける方が入れ替わるだけです。だから「正しい文字コード」を選ぼうとしても答えは出ません。
※Excelの行は手元にExcelが無いため実測ではありません。UTF-8のバイト列をShift_JIS(CP932)として解釈すると 譌・譛ャ闌カ という並びになるというバイト上の事実と、日本語版ExcelがCP932を想定して開く仕様から書いています。LibreOfficeで逆向きの化け方(Shift_JISが ���i�� になる)を実測しているので、現象としては裏が取れています。
どこで開いても化けないのは「BOM付きUTF-8」だけです
表の中で1つだけ、3つの環境すべてで化けないものがあります。BOM付きUTF-8です。
BOMは、ファイルの先頭に置く3バイトの印(EF BB BF)です。文書の中身ではなく、「このファイルはUTF-8です」という宣言にあたります。宣言があれば、開く側は推測をやめて、そのとおりに読みます。ZIPの印とまったく同じ考え方です。
手順
-
まず、化けているのがどちらなのかを確かめる
届いたCSVをそのまま読み込むと、文字コードを自動で判定して表として表示します。ここで正しく読めるなら、ファイルは壊れていません——化けていたのは開き方のほうです。読めない場合は、送り主のほうで壊れている可能性があります。
サンプルで試す → CSV Excel 変換をひらく → -
化けない形に変換して受け取る
判定した文字コードで読み直してxlsxに変換します。xlsxは文字コードを内部に持つ形式なので、変換した時点で文字化けの問題そのものが消えます。以後どの環境で開いても化けません。
あわせて、CSVでよく起きる別の事故も防げます——
CSV Excel 変換をひらく →001のような先頭のゼロが消える、長い数字が1.23E+10になる、1-2が日付になる、といったものです。これらは文字化けとは別の問題ですが、原因は同じ「CSVには型の情報が無い」ことにあります。 -
中身だけ見たいなら、変換もいらない
金額を1つ確認したいだけ、といった用途なら、そのままブラウザで開いて読めば済みます。シートの切り替え・検索・並べ替えができます。ファイルを増やさずに終われます。
xlsx 開くをひらく → -
自分が渡す側のときは、保存形式を選び直す
Excelで保存するとき、「CSV UTF-8(コンマ区切り)」を選ぶとBOM付きUTF-8になります。ただの「CSV(コンマ区切り)」はShift_JISで保存されるため、相手の環境によっては化けます。名前がよく似ているので、送る前に確認してください。
Macの表計算ソフトから書き出す場合は、多くがBOMなしUTF-8になります。相手がWindowsのExcelを使っているなら、そのままでは化けます。相手の環境が分からないときは、CSVではなくxlsxで渡すのがいちばん確実です——xlsxならこの問題は起きません。
よくある質問
ファイルはどこかに送られますか?
送られません。読み込みから変換・ダウンロードまで、すべてブラウザの中だけで処理します。顧客名簿や取引データなど、外に出せないCSVもそのまま扱えます。
化けてしまったファイルは元に戻りますか?
戻ります。化けているのは表示だけで、ファイルの中身は変わっていません。正しい文字コードで開き直せば読めます。ただし化けた状態で上書き保存してしまった場合は戻りません。
BOMを付けて困ることはありませんか?
表計算ソフトで開く用途なら困りません。ただしプログラムでCSVを読み込ませる場合は注意が必要です。BOMの3バイトが1列目の値の先頭に混ざり、「なぜか一致しない」という形で表面化することがあります。システムに取り込ませるCSVを指定された場合は、相手の指定に従ってください。
Excelに「CSV UTF-8」が見当たりません。
古いバージョン(Excel 2013以前)にはこの選択肢がありません。その場合は、xlsxとして保存して渡すか、いったんCSVで保存したものを本ページの手順で変換してください。
先頭のゼロが消えるのも文字化けですか?
別の問題です。文字化けは文字コードの取り違えですが、こちらは「001 を数値の1として読む」という型の取り違えです。原因は共通していて、CSVには文字コードも型も書く場所が無いことにあります。CSV Excel 変換は、先頭のゼロを保ったまま取り込みます。