CSVの文字化けの直し方 — Excelで化けるのは「文字コードの読み違い」。開き方で直る場合と、もう直らない場合
結論から言うと、CSVをExcelで開いたときの文字化けの多くは、ファイルの中身が壊れたのではなく、Excelがファイルを別の文字コードとして読んだ状態です。同じ「経理」という文字でも、UTF-8 と Shift_JIS ではファイルに書かれるバイトの並びが違います。読む側が書いた側と違う文字コードを選ぶと、別の文字に置き換わって見えます。
Microsoft のサポート記事「Excel で CSV UTF-8 ファイルを正しく開くには」は、UTF-8 の CSV ファイルは BOM(バイト オーダー マーク)付きで保存されていれば通常どおり開けて、BOM が無い場合は[データ]タブの「データの取得」(Power Query)などから開く、と案内しています。ダブルクリックで化けたCSVでも、開き方を変えて文字コードを指定すれば、元の文字で読めることがあります。
ただし直らない場合もあります。化けた表示のまま上書き保存したファイルや、保存先の文字コードに無い文字を含んだまま保存したファイルは、元の文字に戻せないことがあります。この記事では、症状から文字コードを見分ける方法、Excel での開き方の違い、渡す側での保存のしかたを、架空のCSVを使って順に確かめます。開く前に元のファイルをコピーして残すことだけは、どの方法でも先に済ませてください。
文字化けの仕組み — 同じ漢字でもバイトの並びが違う
CSVファイルの中身は、文字そのものではなくバイト(0〜255の数)の並びです。どの並びをどの文字として読むかの約束が文字コードで、日本語のCSVでよく使われるのが UTF-8 と Shift_JIS です。日本語の文字は、同じ文字でも文字コードが違えばバイトの並びが変わります(半角の英数字とカンマは UTF-8 と Shift_JIS で同じ1バイトです)。
次の表は、「経理」の2文字を Python の標準の符号化(UTF-8 と、Windows の日本語で使われる cp932=Shift_JIS の拡張)でバイトに直した結果です。
| 文字コード | 「経理」のバイト列(16進数) | バイト数 |
|---|---|---|
| UTF-8 | E7 B5 8C E7 90 86 | UTF-8 では「経理」は6バイト |
| Shift_JIS(cp932) | 8C 6F 97 9D | cp932 では「経理」は4バイト |
UTF-8 で書かれたこの6バイトを、読む側が cp932 として読むと、Python の cp932 の復号では「邨檎炊」という別の3文字になります。ファイルのバイトは1つも変わっていません。変わったのは読み方だけなので、正しい文字コードで読み直せば「経理」に戻ります。
症状から読み違いの向きを見分ける
架空の社員一覧のCSVで確かめます。中身は次の2行で、1列目は先頭がゼロの社員番号です。
社員番号,氏名,部署
00123,山田太郎,経理部
このファイルを書いた文字コードと読んだ文字コードの組み合わせで、2行目の見え方は次のように変わります(Python の復号で、読めないバイトを「�」に置き換えた場合の表示例です。Excel が同じ表示をするかは実機未検証です)。
| 書いた文字コード → 読んだ文字コード | 2行目の見え方(表示例) | 見分け方の目安 |
|---|---|---|
| UTF-8 → UTF-8 | 00123,山田太郎,経理部 | 正しく読めている |
| UTF-8 → cp932 | 00123,螻ア逕ー螟ェ驛�,邨檎炊驛ィ | 見慣れない漢字が並び、半角カナが混じることがある |
| cp932 → UTF-8 | 00123,�R�c���Y,�o���� | 「�」が並び、ところどころに英字が残る |
この例では、どちらの向きでも半角の数字とカンマは化けていません。UTF-8 も cp932 も、半角の英数字とカンマを同じ1バイトで書くからです。社員番号の「00123」やカンマが読めていて日本語だけが化けているなら、区切り方ではなく文字コードの問題だと絞り込めます。逆に、列がずれている・1列にまとまっているなら、文字コードより先に区切り文字を疑います。
UTF-8 → cp932 の行の「驛�」の「�」は、「郎」の UTF-8 の3バイト目(8E)が cp932 では2バイト文字の1バイト目にあたり、続くカンマと組にならなかったために置き換わった1文字です。読み違えた状態のまま保存すると、こうした「�」の部分から元の文字は分からなくなります(後の節で扱います)。
BOMとは — UTF-8 の先頭に付く3バイト
BOM(バイト オーダー マーク)は、ファイルの先頭に置く目印の文字です。UTF-8 の仕様である RFC 3629 の第6節は、U+FEFF という文字を BOM として使うことを説明し、UTF-8 で書くと BOM はいつも EF BB BF の3バイトになるとしています。
Microsoft のサポート記事は「BOM (バイト オーダー マーク) で保存されている場合、通常どおり開くことができます」と書いていますが、その理由までは書いていません。手がかりになるのは Power Query の説明で、文字セットは推論されず「UTF-8 は UTF-8 BOM で始まる場合にのみ推論されます」とあります。BOM の無い UTF-8 のCSVは、中身は正しい UTF-8 でも、Microsoft の記事が別の開き方を案内している対象で、ダブルクリックで開くと化けることがあります。
RFC 3629 の第6節は、先頭の U+FEFF を取り除かずに文字列をつなぐと、つなぎ目に意図しない「幅ゼロの改行しない空白」が残ることがあると注意しています。BOM は画面に見えない文字なので、受け取る側のシステムが BOM を想定していないと、1行目の最初の見出しに見えない文字が付いたまま扱われることがあります(どう扱われるかはシステムによって違い、この記事では実機未検証です)。どちらの形式で渡すかは、受け取る側の取込仕様(BOM 付きの UTF-8、BOM の無い UTF-8、Shift_JIS など)で決めます。
Excel での主な開き方は3通り。結果が変わるのは文字コードを選べるかどうか
同じCSVでも、Excel で開く経路によって文字化けするかどうかが変わります。違いは、開くときに文字コードを人が選べるかどうかです。
| 開き方 | 文字コード | Microsoft の資料での説明 |
|---|---|---|
| ファイルをダブルクリック/[ファイル]→[開く] | 資料に選ぶ手順の記載なし(Excel が自動的に開くと説明) | .csv ファイルは Excel が自動的に開き、新しいブックにデータを表示する。UTF-8 は BOM 付きなら通常どおり開ける |
| [データ]→[テキストまたは CSV から](Power Query) | 選べる(「ファイルの配信元」) | 文字セットは推論されず、UTF-8 は UTF-8 BOM で始まる場合にのみ推論される。違えば一覧から選び直す |
| 拡張子を .csv から .txt に変えて開く | テキスト インポート ウィザードで指定 | Excel で強制的にテキスト インポート ウィザードを実行する方法として案内されている |
このほか Microsoft の記事は、BOM の無い UTF-8 のCSVを開く方法として[テキストからデータを取得](テキスト インポート ウィザードが開く)も挙げています。
ダブルクリックで化けたファイルを、同じファイルのまま「テキストまたは CSV から」で開き直すのが、いちばん手数の少ない直し方です。どの文字コードを選べばよいか分からないときは、プレビューの文字を見ながら、UTF-8 と、日本語のシフト JIS にあたる項目を切り替え、日本語が読めるほうを選びます(一覧での表示名はこの記事では実機未検証です)。
なお、ダブルクリックで開いたときに BOM の無いファイルをどの文字コードとして読むかは、Microsoft の資料に書かれていません。お使いの Windows の言語設定や Excel の版によって変わる可能性があり、この記事では実機未検証です。
「テキストまたは CSV から」で開き直す手順
Microsoft のサポート記事「テキスト (.txt または .csv) ファイルのインポートまたはエクスポート」と、Power Query の「テキスト/CSV」コネクタの説明に沿うと、手順は次のとおりです。画面の名前は Excel の版によって違うことがあります。
- [データ]タブの[データの取得と変換]グループで、[テキストまたは CSV から]を選ぶ。
- CSVファイルを選んで[インポート]を押す。プレビューの画面が開く。
- プレビューの「ファイルの配信元」で、ファイルを作ったときの文字コードを選ぶ。日本語が読めれば合っている。
- 区切り記号がコンマになっているかを確かめる(Power Query は区切り記号を自動で判断するが、推論が正しくないこともある)。
- 新しいワークシートに直接読み込むなら[読み込み]を、既存のワークシートなど読み込む先を指定するなら[読み込み先]を選ぶ。
同じプレビュー画面のデータ型検出の設定で、Power Query の説明は「自動データ型検出をオフにして、代わりにすべての列を既定の "テキスト" にすることもできます」としています。社員番号や商品コードの「00123」を数値に変えずに残したいときは、シートに置く前に、ここで検出をやめるか、プレビューの[データの変換](英語版の説明では Edit)で Power Query エディターを開き、列を選んで[変換]→[データ型]→[テキスト]を選び、型の変更の確認で[現在のものを置換]を選び、最後に[閉じて読み込む]でシートに戻します。
Microsoft の英語版の説明では、Excel は既定で先頭のゼロを自動的に取り除き、Microsoft 365・Excel 2024 などには、この自動変換をやめる設定もあるとされています。すでにゼロが消えた後にシートのセルの書式を「文字列」に変えても、消えたゼロは戻りません(同じ説明の注記)。
渡す側で防ぐ — 保存のときに文字コードを決める
文字化けは、受け取った人が開き方を工夫するより、渡す側が相手の読み方に合わせて保存するほうが確実です。決め方は次の順番です。
- 受け取る側の仕様を見る。会計ソフトや業務システムの取込画面・マニュアルに、受け付ける文字コードが書いてあればそれに合わせる。
- 相手が Excel で開いて見るだけなら、BOM 付きの UTF-8 にする。Microsoft のサポート記事が通常どおり開けると案内している形式だからです。
- 保存した後に先頭のバイトを確かめる。次の節の方法で、BOM が付いたか、付いていないかを見る。
Excel の[名前を付けて保存]で選べる CSV の種類について、Microsoft の「ブックをテキスト形式 (.txt または .csv) で保存する」のページには「CSV (コンマ区切り)」「CSV (Macintosh)」「CSV (MS-DOS)」などが並んでいますが、それぞれの文字コードは書かれていません。お使いの Excel の保存の種類に UTF-8 の CSV がある場合でも、保存したファイルに BOM が付くかどうかはこの記事では実機未検証です。保存の種類の名前ではなく、保存したファイルの先頭のバイトで確かめるのが確実です。
先頭のバイトで確かめる — PowerShell の Format-Hex
Windows では、PowerShell の Format-Hex でファイルの中身を16進数で表示できます。Microsoft の説明(PowerShell 7.6 のページ)では、-Count で表示するバイト数を絞れます。CSVファイルのある場所で、次のように打ちます。
Format-Hex -Path .\shain.csv -Count 16
| 先頭のバイト | 読み取れること |
|---|---|
EF BB BF で始まる | BOM 付きの UTF-8 |
架空の例なら E7 A4 BE(「社」の UTF-8)で始まる | BOM の無い UTF-8 の可能性が高い |
架空の例なら 8E D0(「社」の cp932)で始まる | Shift_JIS(cp932)の可能性が高い |
2行目と3行目は、この記事の架空のCSVの1文字目「社」を Python で符号化した値です。先頭の文字が違えばバイトも違うので、確実に言えるのは1行目の「BOM があるかどうか」だけです。BOM が無いときに UTF-8 か Shift_JIS かを決めるには、前の節の「テキストまたは CSV から」でプレビューを切り替えて、日本語が読めるほうを選びます。なお、Microsoft の説明では -Count は PowerShell 6.2 で導入されたパラメーターなので、それより前の版では使えません。Windows に最初から入っている Windows PowerShell で動くかは、この記事では実機未検証です。
もう直らない場合 — 失われた文字は復元できない
読み違いで化けて見えているだけなら、ファイルのバイトは無傷なので、正しく読み直せば元に戻ります。しかし、次のような保存をした後は、元の文字に戻せないことがあります。
| やったこと | 何が起きるか |
|---|---|
| 化けて見えている状態のまま、上書き保存した | 化けた文字のほうが新しい中身として書き込まれる。読み違いで「�」に置き換わった部分は、元のバイトが分からなくなる(Python で確かめた例。Excel の挙動は実機未検証) |
| Shift_JIS に無い文字を含んだまま、Shift_JIS で保存した | その文字は Shift_JIS では書けないので、別の文字に置き換わるか、保存できない |
2行目の例として、「𠮷」(つちよし)は cp932 に無い文字です。Python で「𠮷野」を cp932 に符号化し、書けない文字を半角の疑問符に置き換えると、結果は疑問符と「野」の2文字になります。一度疑問符に置き換わったファイルからは、そこが「𠮷」だったことは分かりません。Excel で保存したときに同じ置き換えが起きるかは、この記事では実機未検証です。
だからCSVを開く前に元のファイルをコピーして残し、作業はコピーで行うのが確実です。元のファイルを上書きしてしまった後は、渡してくれた人やシステムからもう一度出力してもらうのが、いちばん確かな直し方です。
銀行に渡す振込ファイルは別の話
この記事が扱うのは、会計ソフトや業務システムとやり取りする一般的なCSVです。銀行に渡す総合振込などの全銀フォーマットのファイルは、文字コードやレコードの長さ、使える文字が全国銀行協会のレコード・フォーマットと各銀行の仕様で決まっていて、ここで書いた「BOM 付き UTF-8 にする」は当てはまりません。全銀ファイルの文字コードとレコードの作り方は 全銀フォーマットとは の「文字コード」の節を、振込名義に使える文字は 振込名義カナ変換ツール を見てください。
振込名義を全銀フォーマットで使える文字に変換してチェックするCSVという形式は文字コードを決めていない(RFC 4180)
CSV の書式をまとめた文書としてよく参照されるのが、2005年10月に出た RFC 4180 です。RFC 4180 は冒頭で、自らを「インターネット標準を定めるものではない」情報提供の文書だと書いています。そして文字コードについては、CSV で一般的なのは US-ASCII だが、IANA が「text」の系統向けに定めた他の文字セットも「charset」というパラメータと組み合わせて使えるとしています。
つまり、「CSVだからこの文字コード」という決まりはありません。同じ拡張子 .csv でも、UTF-8(BOM の有無を含む)で書かれたものも Shift_JIS で書かれたものもあり、ファイルの名前からは区別できません。文字化けを繰り返さないためには、取引先やシステムとの間で文字コードとBOMの有無を、取込仕様として文字で決めておくのが確実です。
- CSVの文字化けの多くは、ファイルの中身ではなく読み方(文字コード)の違い。半角の英数字とカンマが読めていれば、文字コードの問題に絞れる
- Microsoft の案内では、UTF-8 のCSVは BOM 付きなら通常どおり開ける。BOM が無ければ「データの取得」(テキストまたは CSV から)で開く
- 「テキストまたは CSV から」なら「ファイルの配信元」で文字コードを選び直せる。UTF-8 が自動で選ばれるのは BOM で始まる場合だけ
- BOM の有無は、保存の種類の名前ではなく先頭の3バイト(
EF BB BF)で確かめる - 化けたまま上書き保存したり、Shift_JIS に無い文字を Shift_JIS で保存したりすると、元の文字には戻せないことがある。開く前に元のファイルを残す
よくある質問
CSVをダブルクリックすると文字化けします。ファイルは壊れていますか?
多くの場合、壊れてはいません。Excel がファイルを書いたときと違う文字コードとして読んだために、別の文字に見えている状態です。Microsoft の案内では、BOM の無い UTF-8 のCSVは[データ]タブの「データの取得」(テキストまたは CSV から)で開けます。開き直す前に元のファイルをコピーして残してください。
文字化けしたまま保存してしまいました。元に戻せますか?
戻せないことがあります。化けた表示のまま上書き保存すると、化けた文字のほうが新しい中身として書き込まれ、読み違いで「�」などに置き換わった部分は元のバイトが分からなくなります(Python で確かめた例で、Excel の挙動は実機未検証です)。元のファイルのコピーが無ければ、渡してくれた人やシステムからもう一度出力してもらうのが確実です。
BOM付きのUTF-8とBOMなしのUTF-8は、どちらで保存すればよいですか?
受け取る側の取込仕様で決めます。仕様に指定があればそれに合わせ、相手が Excel で開いて見るだけなら、Microsoft が通常どおり開けると案内している BOM 付きの UTF-8 が無難です。BOM を想定していないシステムでは、1行目の最初の見出しに見えない文字が付いたまま扱われることがあります(どう扱われるかはシステムによって違い、実機未検証です)。
ファイルの文字コードはどうやって確かめますか?
Windows なら PowerShell の Format-Hex で先頭のバイトを表示し、EF BB BF の3バイトで始まれば BOM 付きの UTF-8 です。BOM が無い場合は先頭のバイトだけでは UTF-8 か Shift_JIS かを決めきれないので、Excel の「テキストまたは CSV から」のプレビューで文字コードを切り替え、日本語が読めるほうを選びます。
文字化けを直したら、今度は先頭のゼロが消えました。
文字コードとは別の問題で、Microsoft の英語版の説明では Excel は既定で先頭のゼロを自動的に取り除きます。「テキストまたは CSV から」で開き、シートに置く前にデータ型の自動検出をやめるか、Power Query エディターで列のデータ型を「テキスト」にして[現在のものを置換]を選ぶと、00123 のような値を文字列のまま残せます。消えた後にセルの書式を変えても、ゼロは戻りません。
銀行に出す振込データ(全銀フォーマットのファイル)も、BOM付きUTF-8にすればよいですか?
いいえ。銀行に渡す全銀フォーマットのファイルは、文字コードやレコードの長さ、使える文字が全国銀行協会のレコード・フォーマットと各銀行の仕様で決まっています。全銀ファイルの文字コードは「全銀フォーマットとは」の記事の文字コードの節で確かめてください。
出典
Microsoft のサポート記事・Power Query と PowerShell の説明ページ、RFC 4180・RFC 3629 の原文を読んで作成。表のバイト列と表示例は Python で符号化・復号した結果で、Excel の実機での表示は確かめていません。
- Microsoft サポート「Excel で CSV UTF-8 ファイルを正しく開くには」(support.microsoft.com/ja-jp/excel/opening-csv-utf-8-files-correctly-in-excel)を2026年10月5日に確認。
- Microsoft サポート「テキスト (.txt または .csv) ファイルのインポートまたはエクスポート」を2026年10月5日に確認。
- Microsoft サポート「ブックをテキスト形式 (.txt または .csv) で保存する」を2026年10月5日に確認。
- Microsoft サポート「Keeping leading zeros and large numbers」(英語版)を2026年10月5日に確認。
- Microsoft Learn「テキスト/CSV」(Power Query コネクタ。learn.microsoft.com/ja-jp/power-query/connectors/text-csv)を2026年10月5日に確認。
- Microsoft Learn「Format-Hex」(PowerShell 7.6。learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/format-hex)を2026年10月5日に確認。
- RFC 4180「Common Format and MIME Type for Comma-Separated Values (CSV) Files」(2005年10月・Informational)。www.rfc-editor.org/rfc/rfc4180.txt
- RFC 3629「UTF-8, a transformation format of ISO 10646」第6節 Byte order mark (BOM)。www.rfc-editor.org/rfc/rfc3629.txt
この記事は一般的な情報提供です。お使いの会計ソフト・業務システムが受け付ける文字コードは、それぞれの取込仕様で確かめてください。