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-8Shift_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は、BOM付きUTF-8で作ってください。相手の環境(Windows / Mac / どの表計算ソフトか)を知らなくても化けません。逆に、自分の環境で開けたからといって相手も開けるとは限りません——それが冒頭の「送ったら化けていると言われた」の正体です。

手順

  1. まず、化けているのがどちらなのかを確かめる

    届いたCSVをそのまま読み込むと、文字コードを自動で判定して表として表示します。ここで正しく読めるなら、ファイルは壊れていません——化けていたのは開き方のほうです。読めない場合は、送り主のほうで壊れている可能性があります。

    サンプルで試す → CSV Excel 変換をひらく →
  2. 化けない形に変換して受け取る

    判定した文字コードで読み直してxlsxに変換します。xlsxは文字コードを内部に持つ形式なので、変換した時点で文字化けの問題そのものが消えます。以後どの環境で開いても化けません。

    あわせて、CSVでよく起きる別の事故も防げます——001 のような先頭のゼロが消える、長い数字が 1.23E+10 になる、1-2 が日付になる、といったものです。これらは文字化けとは別の問題ですが、原因は同じ「CSVには型の情報が無い」ことにあります。

    CSV Excel 変換をひらく →
  3. 中身だけ見たいなら、変換もいらない

    金額を1つ確認したいだけ、といった用途なら、そのままブラウザで開いて読めば済みます。シートの切り替え・検索・並べ替えができます。ファイルを増やさずに終われます。

    xlsx 開くをひらく →
  4. 自分が渡す側のときは、保存形式を選び直す

    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 変換は、先頭のゼロを保ったまま取り込みます。

この手順を、いま試す

化けているCSVを、そのまま読める形に変換する

CSV Excel 変換をひらく 手元にファイルが無ければ、サンプルで試す

関連する手順

全機能無料。 使う・確認はそのまま。結果の持ち帰り(ダウンロード)だけ無料の登録を1回お願いしています(メールの用途はメルマガと製品のお知らせのみ)。ほかの道具は道具の棚へ。