30秒で診断する:データは壊れていない、読み間違えられているだけ
CSVを開いたときに文字化けしていたら、最初に確かめるべきことは、データが壊れたのか、それとも表示だけが間違っているのかです。この2つはまったく別問題で、対処方法も違います。間違った対処をすると、表示だけの問題が本物のデータ損失に変わってしまうことがあります。まず30秒のテストをしてください。同じファイルを、Windowsのメモ帳やMacのテキストエディットをプレーンテキストモードで開くか、Googleスプレッドシートでファイル、読み込みと進んで開いてみます。そこで文字が正しく見えるなら、データは無事で、Excelの表示だけが間違っています。ディスク上のファイルには正しいバイトが残っており、Excelが間違った文字コードで解釈しているだけです。これが最もよくあるケースで、このガイドのすべての修正方法はここから始まります。
2つ目の手がかりは、どの文字が間違って見えるかです。半角の英数字や記号は問題なく見えるのに、アクセント付き文字やウムラウト、セディーユ、ユーロ記号、ラテン文字以外の文字だけがおかしく見えるなら、それは区切り文字の問題でも破損でもなく、文字コードの不一致です。区切り文字の問題なら、行全体が1列にまとまってしまいます。破損なら、すべてがめちゃくちゃになるか、行が欠けます。文字コードの問題はもっと限定的です。UTF-8で2バイト以上必要な文字だけが壊れ、それ以外はそのまま残ります。JoséがJoséと表示されたり、MünchenがMünchenと表示されたりするなら、それはUTF-8のバイトを古い1バイト文字コードで読んだときの指紋です。このパターンだけで原因が分かり、修正方法も決まります。
3つ目の確認で、救出がまだ可能かどうかが決まります。文字化けした文字がテキストエディタでも同じように見える場合、そのファイルは読み間違えた状態で上書き保存されてしまい、間違った文字そのものがファイルに書き込まれている可能性があります。まだ慌てる必要はありませんが、何より元のファイルをもう一度上書き保存してはいけません。後半の救出の章では、まさにこのケースを扱います。ただし、1つだけ本当に回復できない場合があります。保存のときに文字が疑問符や置換記号に置き換わってしまった場合、そのコピーからは元の情報が失われており、元のデータから作り直すしかありません。確認が済むまでは、元のファイルに触れず、コピーで作業し、文字化けしたファイルをよいファイルに上書き保存しないでください。
なぜExcelは推測を間違えるのか:CSVファイルには文字コードの表示がない
この問題が繰り返し起きる理由を理解するには、CSVという形式についての1つの事実を知る必要があります。CSVファイルはプレーンテキストで、どの文字コードで書かれているかを示すヘッダーがありません。表計算ファイルには、構造とテキストの文字コードが一緒に含まれています。しかしCSVファイルにはどちらもありません。あるのはバイトとカンマと改行だけです。プログラムがCSVを開くとき、バイトを文字に変換する方法を自分で決めなければならず、その決め方はプログラムによって違います。最近のテキストエディタやGoogleスプレッドシートは、ほとんどの場合UTF-8を自動で判別するため、同じファイルが正しく見えます。一方、ExcelでCSVをダブルクリックして開く場合、Excelは判別しません。システムの既定の文字コードをそのまま使うのです。多くのWindows環境では、それがWindows-1252のような古いコードページで、正しいかどうかを確認しません。
この前提こそが問題の全体です。UTF-8では、éのような文字は2バイトで、€のような文字は3バイトで表されます。古い1バイト文字コードでは、1バイトがそれぞれ1文字として読まれるため、1文字のéが2文字の間違った文字éになり、1文字の€が3文字の€になります。ファイルは変わっていません。バイトの意味の読み方が変わっただけです。だからこそ、この問題は地域やパソコンによって出方が違います。ファイルと同じ文字コードを既定にしている同僚のパソコンでは正しく見えるのに、あなたのパソコンでは文字化けする。同じファイルが、あるパソコンでは正しく見えて、別のパソコンでは壊れて見える。どちらのパソコンも壊れておらず、ファイルも壊れていません。2つの読み手がバイトの意味について意見が違うだけで、ダブルクリックしたExcelは自分の既定値を尋ねもせずに信じているのです。
この問題がJSONから変換したファイルで特によく起きる理由も、ここから説明できます。JSONは定義上UTF-8です。そのため、JSONからCSVへの変換では当然UTF-8のCSVができあがり、元のデータに含まれるアクセント付きの名前や都市名や通貨記号もすべてそのまま入ります。変換は正しく、開き方が合っていないだけです。たとえばこのページの変換ツールは、BOMなしのプレーンなUTF-8でダウンロードします。これはウェブへのアップロードやデータベース、Googleスプレッドシート、Pythonにとって正しい選択ですが、WindowsのExcelでダブルクリックすると文字コードを間違って推測する可能性があります。不一致が起きているのは変換の段階ではなく、開く段階だと分かれば、修正すべき場所も分かります。取り込みのときに指定するか、BOMを付けるかです。次の章でその両方を説明します。
文字化けを読む:おかしな文字が教えてくれること
文字化けしたテキストはでたらめではなく、読み方を知れば元の文字が分かり、修正する前に診断を確かめられます。代表的なパターンは、Ãの後に別の文字が続く形です。éやä、ü、çを見たら、それはUTF-8の文字をWindows-1252として読んだものです。ÃはUTF-8の並びの最初のバイトが、それ自体1文字として読み間違えられたもので、2番目の文字は2番目のバイトが読み間違えられたものです。このパターンを知れば、頭の中で文字化けを解読できます。éはもともとéで、üはüで、çはçで、ãoはãoです。たとえばSão PauloはSão Pauloと表示されます。最も極端なのはユーロ記号です。€はUTF-8で3バイトなので、€という3文字になります。ダッシュはâ€になり、カーリーアポストロフィは’になります。
文字の種類によってパターンは変わり、その違いも診断の手がかりになります。ラテン文字の名前では、上で説明したÃのパターンが出ます。日本語や韓国語などラテン文字以外の文字では、もっと長い文字化けになります。1文字がUTF-8で3バイトなので、1文字が3文字の間違った文字になるからです。東京と書かれた東京は、æ±äº¬のような文字の並びになりますし、韓国の名前も同じような並びになります。このような長い文字化けが見えたら、診断は同じです。UTF-8を1バイト文字コードとして読んだだけで、関わっている文字が3バイトのものだというだけです。代わりに、文字があるべき場所に疑問符や黒いダイヤ形の置換記号が見える場合は、診断が違います。それらの記号は、表示の読み間違えではなく、保存のときにすでに情報が失われたことを意味します。その場合の対処は、救出の章で説明します。
下のコードブロックは、正確な読み間違えを示しています。正しいUTF-8のテキストを、Excelがダブルクリック時に行うのと同じようにWindows-1252として解釈して作ったものです。作り話の例ではありません。各ペアは機械的に生成したものなので、自分のファイルと照らし合わせて、修正する前に診断を確かめられます。自分のファイルが、あるペアの左側の表示になっているべきところで右側の表示になっているなら、それは文字コードの不一致です。次の章の取り込みによる修正で、ファイル自体を変えずに表示を直せます。
Correct text -> What Excel shows\nJosé García -> José GarcÃ\u00ada\nMünchen -> München\nFrançois -> François\nSão Paulo -> São Paulo\n€50,000 -> €50,000\ncafé — ok -> café — ok\n東京 (Tokyo) -> æ\u00b1京\n김민준 -> 김민준この表が証明していることに注目してください。何も欠けていません。間違った文字はすべて、元の文字の本物のバイトに対応しており、間違った表で解釈されただけです。だからこそ、取り込みによる修正はこれほど完全に効きます。ExcelにファイルがUTF-8だと伝えれば、Excelは同じバイトを正しい表で解釈し直し、すべての文字が編集なし、置換なし、入力し直しなしで元に戻ります。自分のファイルがこのパターンに当てはまるなら、救出の章は飛ばして、取り込みによる修正に直接進んでください。壊れたファイルではありません。読み間違えられたファイルです。
修正方法1:ファイルを取り込んでUTF-8だとExcelに伝える
まず試すべき修正方法はこれです。システムもファイルも何も変えず、区切り文字が何であれ、どんなUTF-8のCSVにも使えます。ファイルをダブルクリックで開くのではなく、まずExcelを開いてから、ガイド付きの取り込みでファイルを開き、文字コードを自分で選びます。取り込みダイアログのプレビューを見れば、選んだ文字コードが正しいかどうかがすぐに分かります。プレビューで文字が正しく表示されれば、シート上でも同じように表示されます。プレビューでまだ文字化けしているなら、まだ何も変更していないので、読み込む前に別の文字コードを試せます。
- Excelでデータ、テキストまたはCSVからと進み、ファイルを選択します。
- プレビューダイアログで、ファイルの文字コードを65001:Unicode(UTF-8)に設定します。古いExcelでは、テキスト取り込みウィザードで同じ項目がUnicode(UTF-8)として表示されます。
- プレビューを確認します。文字が正しく読めるようになったら、そのまま進みます。まだおかしく見える場合は、ファイル自体がUTF-8ではない可能性があるので、リストの中のほかの文字コードを1つずつ試し、プレビューを見てください。
- ファイルが使っている文字に合わせて区切り文字を設定します。カンマ、セミコロン、タブ、パイプのいずれかで、同じプレビューで列が正しく分かれることを確認します。
- 読み込みをクリックします。先頭のゼロを持つコードのようにテキストのままにしなければならない列は、読み込む前の取り込みの段階で、その列をテキストに設定します。
この方法を、困ったときだけの救出手段ではなく、CSVを開くときの既定の方法にしてください。ダブルクリックは、区切り文字と文字コードの両方を推測で決めます。取り込みは、両方を自分で選ぶ方法で、かかる時間は10秒ほど長いだけです。Macでも同じ修正方法が使えます。Macで確実なのは取り込みの方です。空のブックを開き、データ、テキストからと進み、ファイルを選び、ファイルの文字コードとしてUnicode(UTF-8)を選んで完了します。Googleスプレッドシートでは、ほとんどの場合そもそも修正が要りません。ファイル、読み込みと進めばUTF-8を自動で判別するため、Excelでは壊れて見えるファイルがスプレッドシートではきれいに見えることがよくあります。この違い自体が診断になります。スプレッドシートでは正しく見えてExcelでは間違って見えるなら、ファイルは問題なく、Excelが推測を間違えたのです。
修正方法2:BOMを付けてダブルクリックで開けるようにする
同じ種類のファイルを毎日開くなら、そのたびに取り込むのは面倒です。長く使える修正方法は、ダブルクリックのときにExcelが必要とするヒントをファイルに与えることです。そのヒントがBOM、バイトオーダーマークです。ファイルのごく先頭に置かれた、目に見えない3バイトで、このファイルがUTF-8だと示します。Excelは推測する前にBOMを確認するため、BOM付きのUTF-8ファイルは、システムの既定の文字コードがWindows-1252のWindowsでも、ダブルクリックで正しく開きます。BOMはExcelでもほとんどのエディタでも目に見えず、データの行を変えることもありません。変わるのはファイルの最初の3バイトだけです。
BOMを付ける最も簡単な方法は、コードを書く必要がありません。ファイルをメモ帳で開き、ファイル、名前を付けて保存と進み、文字コードのドロップダウンをUTF-8(BOM付き)に設定して保存します。これで、そのファイルはExcelでダブルクリックして正しく開けるようになります。スクリプトからファイルを作る場合は、後から直すのではなく、書き出すときにBOMを付けます。Pythonでは、1つの単語を変えるだけです。ファイルを開くときにutf-8ではなくutf-8-sigという文字コードを指定すれば、PythonがBOMを書き込んでくれます。下のスニペットがその方法で、生成されるバイトも確認済みです。ファイルは3バイトのBOMで始まり、その後にプレーンなUTF-8のデータが続きます。
with open("customers.csv", "w", encoding="utf-8-sig", newline="") as f:\n f.write("name,city\n")\n f.write("José García,München\n")\n# First bytes of the file: EF BB BF, then the UTF-8 data.\n# Excel now opens it correctly on double-click.BOMをどこにでも付ける前に、2つの注意点があります。まず、ツールによってはBOMを目印ではなくデータとして扱います。厳密なCSVパーサーでは、最初のヘッダーが名前ではなく、BOMと名前がくっついたものとして読まれ、ヘッダーの検索が壊れることがあります。このページの変換ツールがあえてBOMなしでダウンロードする理由は、まさにこれです。プレーンなUTF-8は、ウェブへのアップロードやデータベース、Pythonにとって正しい形式で、BOMはExcelのダブルクリックのためだけの便利な工夫です。そのため、BOMはExcel向けのコピーに付け、ほかのツールに渡すマスターのファイルには付けないでください。次に、BOMはUTF-8ではないファイルを直しません。ファイルがWindows-1252で書かれていた場合、その上にBOMを付けると事態は悪化します。Excelは1バイトのデータをUTF-8として解釈し、新しい文字化けが生まれるからです。BOMを付けるのは、UTF-8だと分かっているファイルだけにしてください。診断の章のテキストエディタによるテストで確かめられます。
すでに文字化けした状態で保存されたファイルを救う
ここまでの修正方法はすべて、ディスク上のファイルはまだ正しく、表示だけが間違っているという前提でした。しかし、文字化けしたバージョンがすでに保存されてしまっている場合もあります。そのとき問題になるのは、保存されたコピーから元の文字をまだ取り戻せるかどうかです。答えは、保存のときに何が起きたかによって決まり、区別すべきケースが2つあります。1つ目のケースでは、ディスク上のファイルはまだ元のUTF-8のバイトを持っており、Excelの表示だけが間違っています。これはテキストエディタによるテストで分かるケースです。エディタでは文字が正しく表示されるので、何も失われておらず、修正方法1で表示を直せます。2つ目のケースでは、ディスク上のファイルに間違った文字そのものが含まれています。誰かがExcelで開き、文字化けを見て、そのままCSVとして保存し直し、読み間違えた文字をファイルに書き込んでしまったからです。
2つ目のケースでも、回復できることはよくあります。鍵になるのは、保存されたファイルの文字化けが、解読の章で説明したÃのパターンに従っているかどうかです。保存されたファイルに、éがあるべき場所に文字通りéが含まれているなら、回復は再エンコードです。ファイルをWindows-1252として読み、元のUTF-8のバイトを取り戻し、そのバイトをUTF-8として解釈し直すことで、元の文字が戻ります。下のスニペットはまさにその処理で、実際のファイルで確認済みです。Joséと書かれた名前がJoséと読み間違えられ、往復の処理の後にバイト単位でJoséに戻りました。必ずコピーで作業し、唯一のバージョンでは作業しないでください。Excelで再び開く前に、テキストエディタで結果を確認してください。
with open("mangled.csv", "r", encoding="cp1252") as f:\n text = f.read()\n# Encode back to the bytes Excel misread, then decode as UTF-8.\nfixed = text.encode("cp1252").decode("utf-8")\nwith open("fixed.csv", "w", encoding="utf-8") as f:\n f.write(fixed)\n# Verified: José -> José, München -> München.再エンコードの方法には、守るべき1つの厳しい限界があります。読み間違えた文字が、éとその仲間たちのように、保存のときにそのまま残っていた場合にだけ効きます。保存のときに文字が疑問符や黒いダイヤ形の置換記号に置き換わってしまった場合、そのコピーからは元の情報が失われています。置き換えの記号は、どの文字に置き換わったかについての情報を持っていないため、どんな解釈でも元の文字を取り戻せません。その場合は、コピーの修理をやめ、元のデータからファイルを再生成してください。データベースやツール、元のJSONからもう一度書き出し、今度は修正方法1で開くか、修正方法2でBOMを付けます。そして何をするにしても、再生成したファイルが問題ないと確認できるまでは、壊れたコピーを残しておいてください。置き換えを確認する前に唯一のコピーを削除してしまうことが、回復できる問題を失われたデータセットに変えてしまうのです。
このページの変換ツールで作ったファイルについて
このページの変換ツールは、まさにこのガイドが扱う種類のファイルを作ります。そのため、その動作をはっきり述べておく価値があります。ダウンロードされるのは、BOMなしのプレーンなUTF-8です。これは推測ではなく、実際のコードで確認しました。ダウンロードは文字コードをutf-8としたtext/csvのBlobを作り、先頭の目印を書き込みません。変換エンジン自体も、José GarcíaやMünchen、François、Łódź、São Paulo、ユーロの金額、日本語の東京、韓国の名前を含むサンプルで実行され、すべての文字をバイト単位でそのまま出力し、出力の先頭にBOMはありませんでした。つまり、変換したファイルがExcelで文字化けして見える場合、変換で何かが壊れたのではありません。ファイルは正しいUTF-8で、Excelがダブルクリックで文字コードを間違って推測したのです。
変換したファイルについては、きれいな選択肢が2つあります。1つ目は取り込みの方法です。ダウンロードしたファイルをデータ、テキストまたはCSVからで開き、ファイルの文字コードを65001:Unicode(UTF-8)に設定して読み込みます。文字は正しく読めるようになり、ファイル自体は何も変えていないため、ほかのすべてのツールにとっても有効なままです。2つ目はBOMの方法です。ダウンロードしたファイルをメモ帳で開き、UTF-8(BOM付き)として保存し、そのコピーをExcel用に残し、元のダウンロードはほかの用途のために残します。文字コードの表示の問題を直すためにデータを再変換しないでください。また、変換した出力を表計算ソフトに貼り付けて保存し直すこともしないでください。その往復で、まさにこのガイドが防ごうとしている区切り文字と文字コードの不一致が入り込むことがあるからです。データを直すのではなく、開き方を直してください。
もう1つ、変換ツールに関する大事な点があります。変換ツールでは、ダウンロードする前に区切り文字を選べます。その選択は文字コードとは別です。ファイルは、区切り文字が正しくても文字コードの表示が間違っていることがあり、文字コードが正しくても区切り文字が間違っていることがあり、両方とも間違っていることもあります。変換したファイルが1列で開き、しかも文字もおかしく見える場合は、同じ取り込みで両方の設定を直してください。変換のときに選んだ区切り文字を選び、ファイルの文字コードを65001に設定します。1列で開く問題の区切り文字の半分については、下の関連ガイドで詳しく説明しています。
予防チェックリスト:次から直す必要がないように正しく書き出す
文字コードの問題は、書き手と読み手の不一致です。そのため、予防とは、書き手が何を書いたかを、読み手が守る形で宣言することです。CSVを作るときにこのチェックリストを通れば、次に開く人はこのガイドを必要としません。まず、書き出すときに自分の文字コードを知ってください。データに半角英数字以外のものが含まれているなら、UTF-8で書き出し、ファイル名や一緒に渡すメモでそのことを伝えてください。CSVファイル自体はそれを言えないからです。次に、読み手がWindowsのExcelなら、Excel用のコピーにBOMを付けるか、Excelの名前を付けて保存でCSV UTF-8形式で書き出してください。その形式はBOMを書き込んでくれます。3つ目に、ファイルがほかのツールにも渡るなら、BOMなしのプレーンなUTF-8のコピーも残してください。パーサーによってはBOMを最初のヘッダーの一部として扱うからです。
4つ目に、救出したファイルをテキストエディタで確認するまでは、元のファイルに上書き保存しないでください。Excelからの保存では、区切り文字と文字コードの両方がExcel自身の既定値で書き直され、次の読み手のために不一致が再び入り込んだり、表示の問題が本物のデータ損失に変わったりすることがあります。5つ目に、ファイルを受け取ったら、何かおかしく見える場合はまずテキストエディタで開き、表計算ソフトに上書き保存させる前に文字コードを確認してください。そして6つ目に、元のデータを残してください。CSVは平らにしたスナップショットであり、データそのものではありません。救出がうまくいかなかった場合、元のデータがあれば壊れたコピーを修理するのではなく、きれいに書き出し直せます。文字コードの怖い話の多くは、壊れたCSVが唯一のコピーだったと遅れて気づくことで終わります。あなたのファイルがそうならないようにしてください。
関連ガイド
よくある質問
CSVがExcelでは文字化けするのに、Googleスプレッドシートでは正しく見えるのはなぜですか?
ファイルがUTF-8で、ダブルクリックしたときにExcelが間違った文字コードを推測したからです。一方、スプレッドシートはUTF-8を自動で判別しました。CSVファイルには文字コードの表示がないため、Excelはシステムの既定値、たいていは古いコードページを想定し、UTF-8のバイトを間違って解釈します。Excelでファイルを取り込み、ファイルの文字コードを65001:Unicode(UTF-8)に設定すれば、文字は正しく表示されます。ファイル自体は問題ありません。
CSVでéの代わりにéと表示されるのはどういう意味ですか?
UTF-8のファイルがWindows-1252として読まれたという意味です。éはUTF-8で2バイトで、その各バイトがそれぞれ1文字として読み間違えられ、éになりました。Ãのパターンは、まさにこの不一致の指紋です。データは無事で、修正方法は文字を手で編集することではなく、ファイルをUTF-8で取り込み直すことです。
UTF-8のCSVをExcelで文字化けなしに開くにはどうすればよいですか?
ダブルクリックしないでください。まずExcelを開き、データ、テキストまたはCSVからと進み、ファイルを選択し、ファイルの文字コードを65001:Unicode(UTF-8)に設定し、プレビューを確認して読み込みます。あるいは、ファイルの先頭にUTF-8のBOMを付けてください。たとえばメモ帳でUTF-8(BOM付き)として保存すれば、その後はダブルクリックで開けるようになります。ExcelがBOMを検出するからです。
BOMとは何ですか?CSVにBOMは必要ですか?
BOMは、ファイルの先頭に置かれた目に見えない3バイトで、UTF-8だと示す目印です。これにより、Excelはダブルクリックでも正しく開けます。Excel向けのコピーには役立ちますが、厳密なCSVパーサーによっては最初のヘッダーの一部として扱われるため、ほかのツール用にはBOMなしのプレーンなUTF-8のコピーを残してください。このページの変換ツールはBOMなしでダウンロードします。これはウェブへのアップロードやデータベース、Pythonにとって正しい形式です。
すでに文字化けした状態で保存されたCSVファイルは直せますか?
たいてい直せます。ただし、保存されたファイルに文字通りéのような読み間違えた文字が含まれている場合に限ります。Windows-1252として読み、その文字をバイトに戻し、そのバイトをUTF-8として解釈することで、元のテキストが戻ります。コピーで作業してください。保存のときに文字が疑問符や置換記号に置き換わってしまった場合、そのコピーからは元の情報が失われており、元のデータからファイルを再生成しなければなりません。
日本語や韓国語の文字が長い文字化けの並びになるのはなぜですか?
それらの文字はUTF-8で1文字あたり3バイトだからです。1バイト文字コードとして読み間違えると、1文字が3文字の間違った文字になります。診断はアクセント付き文字の場合と同じで、文字化けが長いだけです。ファイルを65001:Unicode(UTF-8)で取り込めば、すべてが一度に元に戻り、1文字ずつ直す必要はありません。
Excelで文字化けして見える場合、CSVファイルは壊れていますか?
ほぼ確実に壊れていません。破損なら、すべてがめちゃくちゃになるか、行が欠けます。文字コードの不一致は、半角英数字以外の文字だけを壊し、プレーンなテキストはそのまま残します。これがこのガイドで説明したパターンです。ファイルをテキストエディタで開いてください。そこで文字が正しく見えるなら、ファイルは無事で、直すべきなのはExcelでの開き方だけです。
変換してから、正しい文字コードで開く
このページの変換ツールにJSONを貼り付け、きれいなUTF-8のCSVをダウンロードしてください。次に、データ、テキストまたはCSVからで開き、ファイルの文字コードを65001:Unicode(UTF-8)に設定すれば、すべての文字が正しく読めます。アップロードなし、登録なし、ブラウザのタブから何も出ていきません。
JSONからCSVへの変換ツールを開く