- 技術 💻
CSV文字化けの直し方|エクセルで今すぐ直す手順とUTF-8で直らない原因
結論
CSVの文字化けは、Excelの[データ]→[テキストまたは CSV から]で文字コードを選び直せば直ります。化けたまま上書き保存しないことが大切です。
この記事でわかること
- 今すぐ直す4つの方法とMac・スプレッドシートの手順
- 7種類のCSVの先頭バイトと化け方の実物
- UTF-8でも直らない8つの症状の原因と戻し方
CSVの文字化けは、ファイルを保存したときの文字コード(文字をバイトの並びに置き換えるルール)と、Excelが読むときに想定した文字コードが違うために起きます。中身は壊れていないので、正しい文字コードで読み直せば元に戻ります。
flowchart TD
A[UTF-8 の CSV<br>BOM なし] -- ダブルクリック --> S[Excel は Shift_JIS と解釈]
S --> M[文字化け<br>氏名 → 豌丞錐]
M -- 65001 を指定して<br>開き直す --> G[正しく表示]
B[UTF-8 の CSV<br>BOM 付き] -- ダブルクリック --> U[Excel は UTF-8 と解釈]
U --> G
いま化けているCSVは、上書き保存せずに閉じてから、状況に合う方法で開き直します。
| いまの状況 | 直し方 | 詳しい節 |
|---|---|---|
| ダブルクリックで開いたら化けた | [テキストまたは CSV から]で 65001 を選ぶ | 方法1 |
| 次からダブルクリックで開きたい | UTF-8(BOM 付き)で保存し直す | 方法3 |
| 先頭の0・日付も守りたい | .txt にしてウィザードで列を「文字列」に | 方法2 |
| Mac・Numbers・スプレッドシート | 各アプリの読み込みで文字コードを選ぶ | Mac・Google |
| 65001 を選んでも直らない | 二重の化け・上書き保存を疑う | 直らない原因 |
| 一部の文字だけ ? になる | Shift_JIS に無い文字。UTF-8 で出し直す | Shift_JIS に無い文字 |
| 何十本もまとめて直したい | nkf・PowerShell で一括変換 | 方法4 |
| CSV を作る側(プログラム) | BOM 付き UTF-8 か .xlsx で出力 | 作る側の直し方 |
確認環境:Shift_JIS(CP932)・UTF-8・BOM 付き UTF-8・UTF-16・EUC-JP の CSV は、Ubuntu 24.04 上の Python 3.11.15、iconv(glibc 2.39)、nkf 2.1.5 で実際に作り、先頭のバイト、file 5.45・nkf --guess・chardet 7.4.3・charset-normalizer 3.4.7 の判定結果、化け方を確かめました。BOM 付き CSV を出力するコードは Python 3.11.15(pandas 3.0.2)、OpenJDK 21.0.10、PHP 8.4.21、Node.js 22.22.2、PostgreSQL 16.15 で実行し、.xlsx は openpyxl 3.1.5 で作って中身を見ています。Excel(Windows・Mac)の操作は Microsoft の公式ヘルプとドキュメント、Numbers・テキストエディットは Apple、Googleスプレッドシートは Google のヘルプで確かめた内容です(確認日 2026年10月24日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「CSV文字化けの直し方|エクセルで今すぐ直す手順とUTF-8で直らない原因」
エクセルの文字化けを今すぐ直す4つの方法(Windows)
この節では、いま開いて化けている CSV を、元のファイルを壊さずに読める状態にする手順が分かります。
Windows の Excel で CSV をダブルクリックすると、BOM(ファイルの先頭に付く「UTF-8です」という目印)の無い UTF-8 の CSV は、日本語版では Shift_JIS として読まれて化けます。Microsoft のサポート記事は、BOM 付きで保存された UTF-8 の CSV はふつうに開けること、BOM が無いときは Power Query([テキストまたは CSV から])かテキスト ファイル ウィザードで開くことを案内しています。
1テキストまたは CSV から
Power Query のプレビューで文字コードを選ぶ。元のファイルは変わらない。Microsoft 365・Excel 2024・2021 で使える。
2.txt にしてウィザード
拡張子を .txt に変えて開くとウィザードが出る。文字コードと、列ごとの「文字列」を選べる。
3BOM 付きで保存し直す
メモ帳・VS Code で UTF-8(BOM 付き)にする。次からダブルクリックで開ける。
4まとめて変換する
nkf・PowerShell・Python で、何本もの CSV を BOM 付き UTF-8 に一括で直す。
方法1:[テキストまたは CSV から]で文字コードを選んで開く
元のファイルを書き換えずに開ける、いちばん確実な方法です。Microsoft の手順のとおり、空白のブックから取り込みます。
化けたブックを保存せずに閉じる
保存すると、読めなかった文字が失われることがある(後の節で再現)。Excel で空白のブックを開く。
[テキストまたは CSV から]を選ぶ
[データ]タブ →[データの取得 & 変換]グループ →[テキストまたは CSV から]。CSV を選んで[インポート]。
文字コードを選ぶ
プレビュー左上の文字コードの欄(Power Query の文書では「ファイルの配信元」)で、「縺」「繧」のような漢字が並ぶなら 65001: Unicode (UTF-8)、「�」が多いなら 932: 日本語 (シフト JIS)。
[読み込み]を押す
プレビューで日本語が読めたら[読み込み]。シートにテーブルとして入る。
Power Query のドキュメントには「現在、文字セットは推論されず、UTF-8 は UTF-8 BOM で始まる場合にのみ推論されます」とあります。BOM の無い UTF-8 は、ここで自分で 65001 を選ぶのがポイントです。
ほかの文字コードの番号は、Microsoft の「コード ページ識別子」の一覧のとおりです。
| 番号 | 文字コード | 選ぶ場面 |
|---|---|---|
| 65001 | UTF-8 | Web・クラウドのサービスが出した CSV |
| 932 | Shift_JIS(CP932) | 日本語版 Windows の Excel・以前からの業務システム |
| 1200 | UTF-16(リトル エンディアン) | Excel の「Unicode テキスト」で保存したファイル |
| 51932 | EUC-JP | 以前の Unix 系のシステムが出したファイル |
先頭の0(郵便番号・電話番号)を残したいときは、同じプレビュー画面の[データ型検出]で、自動で検出しない設定を選びます。ドキュメントでは「自動データ型検出をオフにして、代わりにすべての列を既定の "テキスト" にすることもできます」と説明されています。
方法2:拡張子を .txt に変えてテキスト ファイル ウィザードで開く
Microsoft のヘルプには、CSV は開くと既定の書式で自動的に解釈され、ウィザードを使いたいときは拡張子を .csv から .txt に変えて開く、と書かれています。列ごとに「文字列」を選べるので、品番が日付に変わる・先頭の0が消える、も同時に防げます。
コピーを作って拡張子を .txt にする
元の CSV は残し、コピーの名前を orders.txt のように変える。
[ファイル]→[開く]で選ぶ
ファイルの種類を「テキスト ファイル」にして、その .txt を開く。テキスト ファイル ウィザードが起動する。
1/3:ファイルの配信元を選ぶ
元のデータ型は「区切り記号付き」。ファイルの配信元で 65001(UTF-8)か 932(シフト JIS)を選び、プレビューで日本語が読めるのを確かめる。
2/3:区切り記号を「コンマ」にする
全部が1列に入るときは、ここが合っていない(タブ・セミコロンのファイルもある)。
3/3:列のデータ形式を選ぶ
郵便番号・電話番号・品番の列を選び、列のデータ形式を「文字列」(ヘルプの表記は「テキスト」)にして[完了]。
リボンからウィザードを出したいときは、Microsoft 365・Excel 2024・2021 では最初に1回だけ設定が要ります。[ファイル]→[オプション]→[データ]で、レガシ データ インポート ウィザードの「テキスト (レガシ)」にチェックを入れ、ブックを閉じて開き直します。そのあと[データ]→[データの取得]→[従来のウィザード]から、テキストのウィザードを選べます。Microsoft は、このウィザードを下位互換のために残している機能とし、Power Query(方法1)を勧めています。
方法3:UTF-8(BOM 付き)で保存し直す(メモ帳・VS Code)
次からはダブルクリックで開けるようにしたいときの方法です。元の CSV は残し、別の名前で保存します。
メモ帳(Windows 10 / 11)
- CSV を右クリック →[プログラムから開く]→[メモ帳]
- メモ帳で日本語が正しく読めることを確かめる
- [ファイル]→[名前を付けて保存]で、エンコードを「UTF-8 (BOM 付き)」にする
- ファイル名の末尾を
.csvにして保存し、そのファイルを Excel で開く
窓の杜の記事によると、メモ帳で選べるエンコードは「ANSI」「UTF-16 LE」「UTF-16 BE」「UTF-8」「UTF-8 (BOM 付き)」です。「UTF-8」は BOM 無しなので、Excel 向けには「UTF-8 (BOM 付き)」を選びます。「ANSI」(日本語版では Shift_JIS)で保存する方法もありますが、𠮷・絵文字などは保存できず失われます(後の節で再現)。
VS Code(Windows・Mac 共通)
VS Code のドキュメントでは、右下のステータスバーに文字コードが表示され、そのボタンを押すと、今のファイルを別の文字コードで開き直すか、別の文字コードで保存するかを選べると説明されています。化けて見えるなら正しい文字コード(Shift JIS・UTF-8 など)で開き直し、読めたら「UTF-8 with BOM」を選んで保存します。
メモ帳でも化けて見えるときは、ファイルが UTF-8 でも Shift_JIS でもない(EUC-JP・UTF-16 など)か、すでに中身が欠けている可能性があります。「化け方から文字コードを見分ける早見表」と「UTF-8でも直らない原因」の節で絞り込めます。
方法4:何本もの CSV をまとめて BOM 付き UTF-8 に変換する
毎月届く CSV を何本も直すときは、コマンドで一括変換します。どれも別のファイルに書き出し、元のファイルは残します。
Linux・Mac(nkf)
mkdir -p fixed
for f in *.csv; do nkf -w8 "$f" > "fixed/$f"; done # -w8 = BOM 付き UTF-8
nkf --guess fixed/*.csv
nkf は入力の文字コードを自動で判定します。手元で Shift_JIS・EUC-JP・UTF-16(BOM 付き)の CSV を nkf -w8 に通すと、どれも UTF-8 (BOM) (CRLF) と判定されるファイルになりました。
Windows(PowerShell 7)
New-Item -ItemType Directory fixed -Force | Out-Null
Get-ChildItem *.csv | ForEach-Object {
Get-Content $_.FullName -Encoding 932 | Set-Content (Join-Path fixed $_.Name) -Encoding utf8BOM
}
PowerShell のドキュメントによると、-Encoding には utf8BOM を指定でき、6.2 以降はコードページの番号(932 など)も指定できます。Set-Content の既定は utf8NoBOM(BOM 無し)なので、Excel 向けには utf8BOM を明示します。元が UTF-8 のファイルなら、-Encoding 932 を -Encoding utf8 に替えます。
UTF-8 か Shift_JIS かが混ざっているときは、後の節の Python のスクリプト(UTF-8 → CP932 の順に試して BOM 付きで保存する)が使えます。
Mac・Numbers・GoogleスプレッドシートでCSVの文字化けを直す
この節では、Windows 以外のアプリで文字コードを合わせる場所が分かります。
| アプリ | 文字コードを合わせる場所 | 元のファイル |
|---|---|---|
| Mac の Excel | [データ]→[データの取得]→[ファイルから]→[テキスト/CSV から] | 変わらない |
| Numbers | 表の[読み込みの設定]→[区切り]→「テキストエンコーディング」 | 変わらない |
| テキストエディット | 設定の「開く/保存」→「標準テキストファイルのエンコーディング」 | 保存し直す |
| Googleスプレッドシート | [ファイル]→[インポート](文字コードの項目は無い) | 変わらない |
Mac の Excel
Microsoft のヘルプ(Excel for Microsoft 365 for Mac・Excel 2024 for Mac・2021 for Mac)の手順です。
- [データ]→[データの取得 & 変換]→[データの取得]→[ファイルから]を選ぶ
- [テキスト/CSV から]を選び、ファイルを選んで[インポート]
- [データのインポート]で取り込むデータを選び、[読み込み]の横の矢印 →[読み込み先]で置く場所を選ぶ
Power Query エディターでの整形は「バージョン 16.69 (23010700) 以降の Excel for Mac」と Microsoft 365 サブスクリプションが条件とされています。取り込んでも化けている場合は、次の Numbers で開くか、方法3(VS Code)・テキストエディットで UTF-8 に保存し直してから取り込みます。
Numbers
Apple の Numbers ユーザガイドの手順です。
- CSV を Dock か「アプリケーション」フォルダの Numbers アイコンにドラッグして開く
- 表を選び、サイドバーの[表]タブから読み込みの設定を開く
- [区切り]タブの「テキストエンコーディング」で文字コード(UTF-8・日本語 (Shift JIS) など)を選ぶ
- [表をアップデート]を押す
Apple のヘルプには、読み込んだ表を編集した後は読み込みの設定を変更できない、とあります。編集する前に文字コードを合わせます。Excel 向けに書き出すときは、[ファイル]→[書き出す]→[CSV]の詳細オプションでテキストエンコーディングを選べます。
テキストエディット(Mac)
Apple のテキストエディットのガイドでは、[テキストエディット]→[設定]→[開く/保存]の「標準テキストファイルのエンコーディング」で、標準テキストを開くとき・保存するときの文字コードを選べます。開くときの文字コードを合わせて CSV を開き、読めたら保存のときの文字コードを選んで、別の名前で保存します。
Googleスプレッドシート
- スプレッドシートを開き、[ファイル]→[インポート]を選ぶ
- CSV を選び、インポート先(新しいスプレッドシートを作成する、新しいシートを挿入する、など)を選ぶ
- 区切り文字(自動的に検出・タブ・カンマ・カスタム)を選び、[インポート]
Google のヘルプのインポート手順には、文字コードを選ぶ項目がありません。Shift_JIS の CSV が化けるときは、方法3・方法4で UTF-8 に保存し直してからインポートします。Excel に渡すためにスプレッドシートから CSV を書き出したときは、先頭に BOM が付いているかを後の節の方法で確かめます。
CSVが文字化けする原因:Excelは BOM で UTF-8 を見分ける
この節では、なぜ同じ CSV が Excel だけで化けるのかが、バイトの並びで分かります。
コンピュータは文字を数値(バイト)の並びで保存します。どの文字をどの数値で表すかのルールが文字コードです。同じ「氏名」でも、文字コードによって中身のバイトがまったく違います。
| 文字コード | 「氏名」のバイト | 主に使われる場所 |
|---|---|---|
| UTF-8 | E6 B0 8F E5 90 8D |
Web、Mac、Linux、クラウドサービスの CSV 出力 |
| UTF-8(BOM 付き) | EF BB BF E6 B0 8F E5 90 8D |
Excel 向けの CSV、メモ帳の「UTF-8 (BOM 付き)」 |
| Shift_JIS(CP932) | 8E 81 96 BC |
日本語版 Windows の Excel、以前からの業務システム |
| UTF-16 LE(BOM 付き) | FF FE 0F 6C 0D 54 |
Excel の「Unicode テキスト」、メモ帳の「UTF-16 LE」 |
| EUC-JP | BB E1 CC BE |
以前の Unix 系システム |
UTF-8 で保存した CSV を Shift_JIS だと思って読むと、別の文字として解釈されます。これが文字化けです。中身は正しいまま、読み方を間違えているだけなので、正しい文字コードで読み直せば戻ります。
Excel でダブルクリックしたとき
Power Query も、UTF-8 と自動で判断するのは BOM で始まるときだけ
Excel で CSV が化けやすい理由は、次の組み合わせです。
- クラウドサービスや Web システムが出力する CSV の多くは UTF-8
- 日本語版 Windows の Excel は、BOM の無い CSV を Shift_JIS として開く
- Power Query も、BOM の無い UTF-8 は自動では UTF-8 と判定しない(ドキュメントの記述)
そのため、作る側が BOM 付き UTF-8 で出力するか、開く側が文字コードを指定する、のどちらかで解決します。UTF-8 と UTF-16 の仕組みそのものは、関連記事「UnicodeとUTF-8の違いとは?UTF-16・サロゲートペアまで実行結果で理解」で扱っています。
どのCSVがExcelで化けるか:7種類のCSVを作って比べた
この節では、同じ内容の CSV を文字コードだけ変えて作り、先頭のバイトと「Excel が Shift_JIS として読んだときの見え方」を並べた結果が分かります。
中身は次の3行(改行は CRLF)です。Python で6種類を作り、Shift_JIS は iconv、BOM 付き UTF-8 と UTF-16 は nkf でも作って、同じバイトになることを確かめました。
rows = "氏名,郵便番号,住所\r\n山田太郎,0123456,東京都千代田区\r\n佐藤花子,0600001,札幌市中央区\r\n"
specs = [("utf8.csv", "utf-8"), ("utf8bom.csv", "utf-8-sig"), ("sjis.csv", "cp932"),
("utf16le.csv", "utf-16"), ("utf16be_nobom.csv", "utf-16-be"), ("eucjp.csv", "euc_jp")]
for name, enc in specs:
with open(name, "w", encoding=enc, newline="") as f:
f.write(rows)
iconv -f UTF-8 -t CP932 utf8.csv > sjis_iconv.csv # cmp で sjis.csv と一致
nkf -w8 sjis.csv > nkf_bom.csv # cmp で utf8bom.csv と一致
nkf -w16L sjis.csv > nkf_w16L.csv # cmp で utf16le.csv と一致
先頭8バイトと大きさです。
utf8.csv 113B E6 B0 8F E5 90 8D 2C E9
utf8bom.csv 116B EF BB BF E6 B0 8F E5 90
sjis.csv 84B 8E 81 96 BC 2C 97 58 95
utf16le.csv 112B FF FE 0F 6C 0D 54 2C 00
utf16be_nobom.csv 110B 6C 0F 54 0D 00 2C 90 F5
eucjp.csv 84B BB E1 CC BE 2C CD B9 CA
unicode_tab.txt 70B FF FE 0F 6C 0D 54 09 00 ← UTF-16・タブ区切り(Excel の Unicode テキストの形)
BOM 付き UTF-8 は、BOM の3バイトだけ大きくなります(113 → 116 バイト)。UTF-16 の BOM は FF FE(リトル エンディアン)で、英数字の後ろに 00 が入ります。
次の表は、Microsoft の説明(BOM 付き UTF-8 はふつうに開ける・Power Query は UTF-8 の BOM しか推論しない)と、日本語版 Windows の既定の文字コード(932)をもとに、ダブルクリックでどうなるかをまとめたものです。「Shift_JIS として読んだ見え方」は、Python で1行目を CP932 として読み、同じ読み違いを再現した実物です。
| ファイル | 先頭の目印 | Shift_JIS として読んだ見え方 | 開くときに選ぶ番号 |
|---|---|---|---|
| UTF-8(BOM なし) | なし | 豌丞錐,驛オ萓ソ逡ェ蜿キ,菴乗園 |
65001 |
| UTF-8(BOM 付き) | EF BB BF |
�サソ豌丞錐,…(Excel は BOM を見て正しく開く) |
不要(ダブルクリックで開く) |
| Shift_JIS(CP932) | なし | 氏名,郵便番号,住所(正しい) |
不要(日本語版 Windows) |
| UTF-16 LE(BOM 付き) | FF FE |
私用領域の文字と英字が並び、コンマの後ろに見えない文字 | 1200 |
| UTF-16 BE(BOM なし) | なし | l T , 染O… のような英字と漢字が混ざる |
1201 |
| EUC-JP | なし | サ睥セ,ヘケハリネヨケ�,スサス�(半角カナが多い) |
51932 |
文字コードの自動判定は、短いファイルで外れることがある
「このファイルは何の文字コードか」を道具に判定させた結果です。3行しかない小さなファイルでは、EUC-JP と BOM の無い UTF-16 で判定が分かれました。
| ファイル | file 5.45 | nkf --guess | chardet 7.4.3 |
|---|---|---|---|
| UTF-8(BOM なし) | UTF-8 text | UTF-8 (CRLF) | utf-8(0.99) |
| UTF-8(BOM 付き) | UTF-8 (with BOM) text | UTF-8 (BOM) (CRLF) | UTF-8-SIG(1.00) |
| Shift_JIS | Non-ISO extended-ASCII text | Shift_JIS (CRLF) | cp932(0.04) |
| UTF-16 LE(BOM 付き) | UTF-16, little-endian text | UTF-16 LE (BOM) (CRLF) | UTF-16(1.00) |
| UTF-16 BE(BOM なし) | data | CP932 (MIXED NL) | utf-16-be(0.95) |
| EUC-JP | ISO-8859 text | EUC-JP (CRLF) | GB18030(0.11) |
charset-normalizer 3.4.7 は、EUC-JP のファイルを cp949(韓国語)と判定しました。file は Shift_JIS を「Non-ISO extended-ASCII」としか言わず、EUC-JP を「ISO-8859」と表示します。判定結果は目安にとどめ、最後は Excel のプレビュー(方法1)やメモ帳で、日本語が読めるかを目で確かめます。
化け方から文字コードを見分ける早見表(実例つき)
この節では、画面に出ている文字の形から、本当の文字コードと選ぶ番号が分かります。
氏名,住所 と 山田太郎 を、わざと間違った文字コードで読ませた結果です。Python 3.11 の bytes.decode(..., errors="replace") で実際に化けさせました。� は変換できなかったバイトです。
| 見え方(実例) | 何が起きたか | 直し方 |
|---|---|---|
豌丞錐,菴乗園 / 螻ア逕ー螟ェ驛� |
UTF-8 を Shift_JIS で読んだ(Excel のダブルクリックで最も多い) | 65001 を指定して開く |
�サソ豌丞錐,菴乗園 |
BOM 付き UTF-8 を Shift_JIS で読んだ。先頭に サソ が付く |
65001 を指定して開く |
����,�Z�� / �R�c���Y |
Shift_JIS を UTF-8 で読んだ(Mac・スプレッドシート・プログラムで多い) | 932 を指定して開く |
��,�所 |
UTF-8 を欧米向けの文字コード(Windows-1252)で読んだ | 65001 を指定して開く |
氏名,住所 |
UTF-8 を Mac の欧米向けの文字コード(Mac Roman)で読んだ | 65001 を指定して開く |
サ睥セ,スサス� |
EUC-JP を Shift_JIS で読んだ。半角カナが多い | 51932 を指定して開く |
日本語が消え、l T @ のような英字と見えない文字が並ぶ |
UTF-16 を UTF-8 や Shift_JIS で読んだ | 1200 を指定して開く |
見分けるコツ
- 「縺」「繧」「繝」「譁」のような見慣れない漢字が並ぶ → 中身は UTF-8。65001 を選ぶ
- 「�」が多く、ところどころ
eXgのような英字が混ざる → 中身は Shift_JIS。932 を選ぶ - 「æ」「ã」「â€」などのアクセント付き文字が並ぶ → 中身は UTF-8。65001 を選ぶ
- 半角カナ(サ・ス・ヘ)が多い → 中身は EUC-JP。51932 を選ぶ
文字化けテスト で試すと、UTF-8 を Shift_JIS で読んだ場合は 譁�蟄怜喧縺代ユ繧ケ繝�、Shift_JIS を UTF-8 で読んだ場合は ���������e�X�g になりました。
CSVの文字化けがUTF-8でも直らない原因と直し方
この節では、65001(UTF-8)を選んでも化けたまま・一部だけおかしい、というときの原因の切り分けと、戻せるかどうかが分かります。
まず、メモ帳や VS Code で開いたときの見え方で、どの段階の問題かを分けます。
flowchart TD
A[65001 を選んでも おかしい] --> B{メモ帳で見ると}
B -- 正しく読める --> C[区切り・自動変換<br>方法2で文字列に]
B -- 縺 繧 が並ぶ --> D[二重の化け<br>Python で戻す]
D -- 戻らない行 --> E[上書き保存で欠けた<br>元のファイルを取り直す]
| 症状 | 原因 | 対処 |
|---|---|---|
UTF-8 を選んでも 豌丞錐 のまま |
化けた文字のまま UTF-8 で保存された(二重の化け) | 下の「二重に化けている」の手順で戻す |
どの文字コードでも一部が ? や � のまま |
化けた状態で上書き保存した | 元のファイルを取り直す |
①・㈱・髙・𠮷・絵文字だけ ? になる |
Shift_JIS に無い文字を Shift_JIS で保存した | UTF-8(BOM 付き)で出力し直す |
| 文字は読めるが全部が A 列に入る | 区切り文字がコンマでない(タブ・セミコロン) | 方法1・2で区切り記号を選ぶ |
先頭の0が消える・1-2 が日付になる |
文字化けではなく Excel の自動データ変換 | 列を「文字列」で読み込む(方法2) |
1.23457E+15 や ##### になる |
指数表示と列幅の問題(文字化けではない) | 列を「文字列」にする・列幅を広げる |
| 行がずれる、1つのセルが2行に分かれる | セルの中の改行が " で囲まれていない |
出力側で値を " で囲む |
.xlsx を開くと記号だらけ |
中身と拡張子の不一致、ブックの破損 | 下の「Excelファイルそのものが化ける」 |
- 1化けたブックを上書き保存していないか保存したファイルからは、失われた文字は戻らない。元の CSV を取り直す
- 2受け取った CSV そのものを開いているか途中で誰かが開いて保存したファイルは、二重に化けていることがある
- 365001 と 932 の両方を試したか「UTF-8 のはず」と思っても、実際は Shift_JIS のことがある
- 4UTF-16・EUC-JP の可能性を見たか1200・51932 を試す。早見表の見え方とも比べる
- 5区切り記号はコンマか文字は読めて1列に入るなら、文字コードではなく区切りの問題
二重に化けている(化けた文字のまま UTF-8 で保存された)
65001 を選んでも 豌丞錐 のように化けたままなら、化けた文字そのものが UTF-8 で保存されている「二重の化け」です。UTF-8 の CSV を誰かが Shift_JIS として開き、化けた見た目のまま UTF-8 で保存し直すと、この形になります。読み方は正しいので、Excel の文字コードを何に変えても直りません。
手元で再現し、Python で戻せるかを試しました。化けた文字列を CP932 のバイトに戻し、UTF-8 として読み直します。
src = open("double.csv", encoding="utf-8", newline="").read()
for line in src.split("\r\n")[:3]:
try:
print("戻せた:", line.encode("cp932").decode("utf-8"))
except UnicodeError as e:
print("戻せない:", line, "|", type(e).__name__)
戻せた: 氏名,郵便番号,住所
戻せない: 螻ア逕ー螟ェ驛�,0123456,譚ア莠ャ驛ス蜊�莉」逕ー蛹コ | UnicodeEncodeError
戻せない: 菴占陸闃ア蟄�,0600001,譛ュ蟷悟クゆクュ螟ョ蛹コ | UnicodeEncodeError
見出しの行は元に戻りました。2行目・3行目は、読み違えたときに �(置き換え文字)になったバイトがあり、その部分の元の値が残っていないため戻せませんでした。� を含まない行は戻せる、含む行は元のファイルが要る、が目安です。
上書き保存すると戻らない(再現)
文字化けした状態のまま Shift_JIS で保存すると、読めなかったバイトが別の文字に置き換わり、元のデータが失われます。Python で「UTF-8 の CSV を Shift_JIS として表示 → Shift_JIS で保存 → UTF-8 で読み直す」という流れを再現しました。
src = "文字化けテスト,山田太郎"
shown = src.encode("utf-8").decode("cp932", errors="replace") # 化けて表示
saved = shown.encode("cp932", errors="replace") # そのまま保存
print(saved.decode("utf-8", errors="replace")) # 正しく読み直す
�?字化けテス�?,山田太�?
「文」「ト」「郎」が失われました。文字化けに気づいたら、上書き保存せずに閉じるのがいちばん大切です。
Shift_JIS に無い文字(機種依存文字・𠮷・絵文字)
Windows の「Shift_JIS」は、正確には Shift_JIS に Windows 独自の文字を足した CP932(Java では Windows-31J)です。Python 3.11 で文字ごとに変換を試した結果です。
| 文字 | Unicode | Shift_JIS | CP932 |
|---|---|---|---|
| ① ㈱ ㎡(丸数字・記号) | U+2460 ほか | エラー | 87 40 ほか |
| 髙(はしごだか)・﨑(たつさき) | U+9AD9 / U+FA11 | エラー | EE E0 / ED 95 |
| ~(全角チルダ) | U+FF5E | エラー | 81 60 |
| 〜(波ダッシュ) | U+301C | 81 60 |
81 60(読み戻すと ~ U+FF5E) |
| 𠮷(つちよし)・😀(絵文字) | U+20BB7 / U+1F600 | エラー | エラー |
- 「Shift_JIS」を指定すると、① や 髙 も保存できません。Python は
'shift_jis' codec can't encode character '髙'で止まりました。「CP932」(Java は「Windows-31J」)を指定すると保存できます - 𠮷 と絵文字は CP932 にもありません。Shift_JIS 系で CSV を出す限り保存できないので、UTF-8(BOM 付き)に切り替えるか、事前に置き換えます
- 波ダッシュ(〜)は、CP932 で保存して読み戻すと全角チルダ(~)に変わりました。見た目は似ていても別の文字なので、突き合わせや検索で一致しなくなります
- Java の
Windows-31Jでは、〜(U+301C)と −(U+2212)が?になりました。言語によって変換の結果が違う点に注意が要ります
道具によって、変換できない文字の扱いも違いました。
| 道具 | 𠮷・😀 を CP932 にしたとき |
|---|---|
iconv -t CP932 |
iconv: illegal input sequence at position 0 で止まる(終了コード 1) |
iconv -c -t CP932 |
変換できない文字を黙って捨てる |
iconv -t CP932//TRANSLIT |
? に置き換える |
nkf -s |
エラーを出さず(終了コード 0)、CP932 として読めないバイトを書き出す |
Python encode("cp932") |
UnicodeEncodeError で止まる |
printf '😀' | nkf -s の出力は F0 9F 0A で、絵文字の4バイトのうち2バイトだけが残りました。止まらない道具ほど、気づかないうちに文字が欠けます。変換のあとは、件数や特定の文字が残っているかを確かめます。
先頭の0・日付・指数表示の自動変換
文字化けと同じくらい多いのが、Excel の自動データ変換です。
| 元のデータ | ダブルクリックで開くと | 対策 |
|---|---|---|
0123456(郵便番号) |
123456 |
列を「文字列」で読み込む |
09012345678(電話番号) |
9012345678 |
同上 |
1-2(品番) |
1月2日 |
同上 |
1234567890123456(16桁) |
1.23457E+15(16桁目以降が失われる) |
同上 |
Microsoft 365・Excel 2024・2021 の Excel には、[ファイル]→[オプション]→[データ]→「自動データ変換」に、「先頭のゼロを削除して数値に変換する」「長い数値の最初の 15 桁を保持し、指数形式で表示」「文字 "E" を囲む数字を指数形式の数値に変換」「連続文字と数字を日付に変換する」の項目があります(Microsoft のヘルプの表記)。チェックを外すと、その変換が行われなくなります。ほかの人の PC では設定が違うので、配布する手順書では方法2の「文字列で読み込む」を案内するほうが確実です。詳しくは、関連記事「CSVをExcelで開くと先頭の0が消える|日付・指数表示の防ぎ方」で扱っています。
改行コードとセル内の改行
- 改行コード(行の終わりを表す文字)は、Windows では CRLF、Mac・Linux では LF が一般的です。Python の
csvモジュールは既定で CRLF、pandas のto_csvは Linux 上で LF を出力しました。pandas で CRLF にしたいときはlineterminator="\r\n"を指定します - セルの中に改行やコンマ、
"がある値は、"で囲むのが CSV のルール(RFC 4180)です。Python のcsv.writerは東京都\n千代田区を"東京都\n千代田区"、「"引用"」を"「""引用""」"と自動で囲みました。文字列を自分でつなげて CSV を作ると、ここで行がずれます
Excelファイル(.xlsx)そのものが化けて見えるとき
「エクセルファイルが文字化けする」場合は、CSV とは原因が違います。
- 拡張子と中身が合っていない:
.xlsxは中身が ZIP 形式で、先頭がPKで始まります。fileコマンドで調べると、本物はMicrosoft Excel 2007+、名前だけ.xlsxに変えた CSV はCSV Unicode text, UTF-8 textと表示されました。中身が CSV なら、拡張子を.csvに戻して方法1〜3で開きます - ブックの破損:Microsoft のヘルプでは、[ファイル]→[開く]→ ファイルを選び、[開く]の横の矢印 →[開いて修復]→[修復]の手順が案内されています。回復できないときは[データの抽出]で値と数式を取り出します
- .xlsx をメモ帳で開いた:ZIP なので記号だらけに見えるのが正常です。Excel で開きます
- 文字が □ や空白で表示される:文字コードではなく、使っているフォントにその文字の形が無いことが原因の一つです。セルのフォントを別の日本語フォントに変えて表示が変わるかを見ます
文字化けを直すときにやってはいけない操作
この節では、直そうとして逆にデータを失う操作と、その代わりにする操作が分かります。
化けているのに気づいたとき
上の再現では「文」「ト」「郎」が失われた
保存し直すときの文字コード
CP932 にも 𠮷 と絵文字は無い
Windows の設定
Windows 全体に効き、再起動が要る設定
Windows の「設定」→「時刻と言語」→「言語と地域」→「管理言語設定」→「システム ロケールの変更」には、「ベータ: 世界中の言語をサポートするには Unicode UTF-8 を使用します」という項目があります。Microsoft のドキュメントでは、変更を有効にするには PC の再起動が要るとされ、名前のとおりベータの扱いです。ほかのアプリの文字の扱いにも関わるため、CSV を開くための手段としては、影響が1つのファイルで済む方法1〜4を先に使います。
文字コードを確かめる・変換するコマンド(file・nkf・iconv・Python)
この節では、届いた CSV の文字コードを調べ、Excel 向けに変換するコマンドが分かります。
Linux・Mac(file・nkf・iconv)
file -i orders.csv # 文字コードの推定(macOS は file -I)
nkf --guess orders.csv # 日本語の文字コードの推定
nkf -w8 in.csv > out_bom.csv # 何の文字コードでも → BOM 付き UTF-8
iconv -f CP932 -t UTF-8 in.csv > out.csv # Shift_JIS(CP932) → UTF-8(BOM なし)
{ printf '\xEF\xBB\xBF'; iconv -f CP932 -t UTF-8 in.csv; } > out_bom.csv # BOM 付きにする
nkf は Mac なら Homebrew、Ubuntu なら apt の nkf パッケージで入ります。iconv は入力の文字コードを自分で指定する必要があり、判定はしません。
Windows(PowerShell 7)
Get-Content .\in.csv -Encoding 932 | Set-Content .\out.csv -Encoding utf8BOM
ファイルの先頭3バイトを見て BOM を確かめる(Python)
import sys
for name in sys.argv[1:]:
head = open(name, "rb").read(3)
print(name, head.hex(" ").upper(), "BOM 付き UTF-8" if head == b"\xef\xbb\xbf" else "BOM なし")
UTF-8 か Shift_JIS かを判定して BOM 付き UTF-8 に変換(Python・どの OS でも)
# 使い方: python3 to_excel_csv.py 入力.csv 出力.csv
import sys
src, dst = sys.argv[1], sys.argv[2]
data = open(src, "rb").read()
for enc in ("utf-8-sig", "cp932"): # UTF-8(BOM 有無とも)→ CP932 の順に試す
try:
text = data.decode(enc)
break
except UnicodeDecodeError:
continue
else:
sys.exit("UTF-8 でも CP932 でもありません")
with open(dst, "w", encoding="utf-8-sig", newline="") as f:
f.write(text)
print(f"{src}: {enc} として読み、BOM付きUTF-8で {dst} に保存しました")
utf8.csv: utf-8-sig として読み、BOM付きUTF-8で conv_utf8.csv に保存しました
sjis.csv: cp932 として読み、BOM付きUTF-8で conv_sjis.csv に保存しました
utf8bom.csv: utf-8-sig として読み、BOM付きUTF-8で conv_utf8bom.csv に保存しました
UTF-8 でも CP932 でもありません ← eucjp.csv
UTF-8 として読めるかを先に試すのは、Shift_JIS のファイルは UTF-8 としてはほぼ必ずエラーになるためです。EUC-JP のファイルは、この例では CP932 としても読めずに止まりました。止まったファイルは、nkf --guess や早見表で文字コードを確かめてから変換します。
文字化けしないCSVの作り方(作る側:BOM付きUTF-8・.xlsx)
この節では、CSV を出力する側が、Excel で開く人に化けないファイルを渡す方法と、言語ごとのコードが分かります。
Windows の Excel で開く人に渡す CSV は、BOM 付き UTF-8 で出力すると、ダブルクリックで開いても化けません。
| 出力の形 | Excel でダブルクリック | ほかのソフト・システム |
|---|---|---|
| UTF-8(BOM なし) | 日本語版では化ける | 多くのソフトで読める。システム間連携の標準 |
| UTF-8(BOM 付き) | 正しく開ける | BOM に対応していない読み手では、1列目の名前の先頭に余計な文字が付く |
| Shift_JIS(CP932) | 正しく開ける | 𠮷・絵文字は保存できない。Mac・海外のソフトでは化けやすい |
| .xlsx(Excel のブック) | 正しく開ける(文字コードの指定が要らない) | 表計算ソフト以外では読みにくい |
| 渡す相手 | 選ぶ形 | 理由 |
|---|---|---|
| Excel で開く人(ダウンロード) | UTF-8(BOM 付き) | ダブルクリックで開け、𠮷・絵文字も残る |
| ほかのシステム(連携) | UTF-8(BOM なし)か相手の仕様 | BOM を文字として読む読み手がある |
| Shift_JIS 指定の取引先・業務システム | CP932(Windows-31J) | 事前に 𠮷・絵文字が無いかを確かめる |
| 書式・複数シートも渡したい | .xlsx | CSV の文字コードの問題が起きない |
連携先に仕様があるときは、その仕様に合わせます。仕様の決め方は、関連記事「CSV出力・取込の仕様設計|文字コード・BOMとエラーチェック一覧」で扱っています。
Excel 自身で CSV に保存し直すときは、Microsoft の手順のとおり[ファイル]→[名前を付けて保存](または[コピーを保存])で、ファイルの種類から CSV の形式を選びます。一覧を下にたどると、ほかの CSV の形式も選べます。Microsoft の Excel for Mac の形式一覧では、Excel 2016 for Mac の項に「CSV UTF-8 (Comma delimited)」があり、作業中のシートを UTF-8 で書き出す形式、「Comma Separated Values (.csv)」はコンマ区切りで書き出す形式と説明されています。保存したファイルに BOM が付いたかは、上の Python の3バイトの確認で分かります。
以下のコードは、どれも同じ内容(見出し+2行、髙橋﨑子 を含む)を出力し、先頭3バイトが EF BB BF、改行が CRLF の3行、file コマンドで CSV Unicode text, UTF-8 (with BOM) text になることを確かめました。
Python(csv・pandas)
import csv
rows = [["注文番号", "氏名", "郵便番号", "金額"],
["A-001", "山田太郎", "0123456", 1500],
["A-002", "髙橋﨑子", "0600001", 2800]]
# csv モジュール:encoding="utf-8-sig" で BOM が付く。newline="" は必須
with open("orders.csv", "w", encoding="utf-8-sig", newline="") as f:
csv.writer(f).writerows(rows)
import pandas as pd
df = pd.DataFrame(rows[1:], columns=rows[0])
df.to_csv("orders.csv", encoding="utf-8-sig", index=False, lineterminator="\r\n")
newline="" を付けないと、Windows では改行が \r\r\n になり、Excel で空行が挟まります(Python の csv モジュールのドキュメントに記載)。Python での読み書き全般は、関連記事「PythonでCSVを読み書き|コピペ用テンプレートと文字化け対策」で扱っています。
Java
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.List;
public class WriteCsv {
public static void main(String[] args) throws IOException {
List<String[]> rows = List.of(
new String[]{"注文番号", "氏名", "郵便番号", "金額"},
new String[]{"A-001", "山田太郎", "0123456", "1500"},
new String[]{"A-002", "髙橋﨑子", "0600001", "2800"});
try (BufferedWriter w = Files.newBufferedWriter(Path.of("orders.csv"), StandardCharsets.UTF_8)) {
w.write(''); // BOM(UTF-8 で書くと EF BB BF になる)
for (String[] r : rows) {
w.write(String.join(",", r)); // 値にコンマ・改行・" があるときは " で囲む処理を足す
w.write("\r\n");
}
}
}
}
java WriteCsv.java(OpenJDK 21.0.10)で実行しました。Shift_JIS 系で出すときは Charset.forName("Windows-31J") を使います("Shift_JIS" では ① や 髙 が ? になりました)。Java での CSV 全般は、関連記事「Java CSV読み込み・書き込み入門|文字化けを防ぐBOMと文字コード」で扱っています。
PHP
<?php
$rows = [['注文番号', '氏名', '郵便番号', '金額'],
['A-001', '山田太郎', '0123456', 1500],
['A-002', '髙橋﨑子', '0600001', 2800]];
$fp = fopen('orders.csv', 'w');
fwrite($fp, "\xEF\xBB\xBF"); // BOM
foreach ($rows as $r) {
fputcsv($fp, $r, ',', '"', '', "\r\n"); // escape は '' を明示、eol は PHP 8.1 以降
}
fclose($fp);
PHP 8.4.21 では、fputcsv の escape 引数を省略すると Deprecated: fputcsv(): the $escape parameter must be provided as its default value will change が出ました。PHP のマニュアルでは、RFC 4180 に沿った CSV には "" を明示する方法が案内されています。
Node.js
import { writeFileSync } from "node:fs";
const rows = [["注文番号", "氏名", "郵便番号", "金額"],
["A-001", "山田太郎", "0123456", 1500],
["A-002", "髙橋﨑子", "0600001", 2800]];
// コンマ・改行・" を含む値は " で囲み、" は "" にする
const esc = (v) => /[",\r\n]/.test(String(v)) ? `"${String(v).replaceAll('"', '""')}"` : String(v);
const csv = rows.map((r) => r.map(esc).join(",")).join("\r\n") + "\r\n";
writeFileSync("orders.csv", "" + csv, "utf8"); // 先頭に BOM
node write_csv.mjs(Node.js 22.22.2)で実行しました。
SQL(PostgreSQL・MySQL)
PostgreSQL の COPY と MySQL の SELECT ... INTO OUTFILE には BOM を付ける設定がないため、シェルで BOM を先に書いてからつなげます。
# PostgreSQL(psql の \copy で標準出力へ)
printf '\xEF\xBB\xBF' > orders.csv
psql -d mydb -c "\copy (SELECT no AS 注文番号, name AS 氏名, zip AS 郵便番号, amount AS 金額 FROM orders ORDER BY no) TO STDOUT WITH (FORMAT csv, HEADER)" >> orders.csv
PostgreSQL 16.15 で実行すると、先頭が EF BB BF、file の結果が CSV Unicode text, UTF-8 (with BOM) text のファイルになりました。
-- MySQL:secure_file_priv のフォルダー(例 /var/lib/mysql-files/)に書き出す
SELECT '注文番号', '氏名', '郵便番号', '金額'
UNION ALL
SELECT no, name, zip, amount FROM orders
INTO OUTFILE '/var/lib/mysql-files/orders_body.csv'
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
{ printf '\xEF\xBB\xBF'; cat /var/lib/mysql-files/orders_body.csv; } > orders.csv
MySQL 8.0.46 で、見出しの値に CONVERT(0xEFBBBF USING utf8mb4) をつなげて SQL だけで BOM を入れる方法も試しましたが、OPTIONALLY ENCLOSED BY '"' のもとでは BOM が " の内側に入り、ファイルの先頭が 22 EF BB(" のあとに BOM)になりました。この形では BOM として働かないので、シェルで先頭に付ける方法を使います。
Shift_JIS で出したいときは、PostgreSQL は WITH (FORMAT csv, ENCODING 'SJIS')、MySQL は CHARACTER SET cp932 です。PostgreSQL 16.15 では、① ㈱ ~ 髙 﨑 は変換でき、絵文字は ERROR: character with byte sequence 0xf0 0x9f 0x98 0x80 in encoding "UTF8" has no equivalent in encoding "SJIS" で止まりました。
Web アプリでダウンロードさせるとき
- 本体の先頭に BOM を付け、レスポンスヘッダーは
Content-Type: text/csv; charset=UTF-8にする(text/csvとcharset引数は RFC 4180 で定められています) - 日本語のファイル名は
Content-Disposition: attachment; filename*=UTF-8''%E6%B3%A8%E6%96%87.csvのように UTF-8 でエンコードして渡す
CSV ではなく .xlsx で渡す
文字コードの取り違えそのものを避けたいときは、Excel のブック(.xlsx)で渡す方法もあります。openpyxl 3.1.5 で 𠮷田😀 と 髙橋﨑子 を入れた .xlsx を作り、中身を見ました。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
for r in [["氏名", "郵便番号", "住所"],
["𠮷田😀", "0123456", "東京都千代田区"],
["髙橋﨑子", "0600001", "札幌市中央区"]]:
ws.append(r)
wb.save("orders.xlsx")
先頭4バイト: 50 4B 03 04(PK。ZIP 形式)
file: Microsoft Excel 2007+
xl/worksheets/sheet1.xml の A2: <c r="A2" t="inlineStr"><is><t>𠮷田😀</t></is></c>
読み戻した2行目: ['𠮷田😀', '0123456', '東京都千代田区']
.xlsx の中のシートは XML で、文字は Unicode の番号(𠮷 が 𠮷)で入っていました。郵便番号も文字列のまま入り、先頭の0が残りました。
読み込む側の注意:BOMで1列目の名前が取れない
BOM 付きの CSV をプログラムで読むと、1列目の見出しの先頭に BOM が混ざり、列名で値を取り出せないことがあります。上の Java で作った BOM 付き CSV を Python で読んだ結果です。
import csv
for enc in ("utf-8", "utf-8-sig"):
rows = list(csv.DictReader(open("orders.csv", encoding=enc, newline="")))
print(enc, repr(list(rows[0].keys())[0]))
utf-8 '注文番号'
utf-8-sig '注文番号'
utf-8 で読むと列名が '注文番号' になり、row["注文番号"] は KeyError になります。encoding="utf-8-sig" で読むと、BOM があってもなくても正しく読めます。読み込み時のエラー全般は、関連記事「UnicodeDecodeErrorの原因と直し方|cp932・utf-8・BOM」で扱っています。
よくある質問
Q. CSVが文字化けするのはなぜ? A. CSV を保存したときの文字コードと、Excel が読むときの文字コードが違うためです。日本語版 Windows の Excel は、BOM の無い CSV を Shift_JIS として読むので、UTF-8 の CSV が化けます(「CSVが文字化けする原因」の節)。
Q. エクセルの文字化けの直し方は? A. 化けたブックを保存せずに閉じ、空白のブックで[データ]→[テキストまたは CSV から]を選び、プレビューの文字コードを 65001(UTF-8)か 932(シフト JIS)にして読み込みます(方法1)。
Q. CSVを文字化けしないように開くには? A. ダブルクリックせず、方法1か方法2(拡張子を .txt に変えてウィザードで開く)で文字コードを選んで開きます。毎回ダブルクリックで開きたいなら、UTF-8(BOM 付き)で保存し直します(方法3)。
Q. CSVの文字化けがUTF-8でも直らないのはなぜ?
A. 化けた文字のまま UTF-8 で保存された「二重の化け」か、化けた状態で上書き保存して文字が欠けたかのどちらかが多いです。前者は � を含まない行なら Python で戻せ、後者は元のファイルを取り直します(「UTF-8でも直らない原因」の節)。
Q. Excel で UTF-8 の CSV を開くには? A. BOM 付きならダブルクリックで開けます。BOM 無しは、[テキストまたは CSV から](方法1)かテキスト ファイル ウィザード(方法2)で 65001 を指定します。Mac は[データ]→[データの取得]→[ファイルから]→[テキスト/CSV から]で取り込みます。
Q. エクセルで保存したら文字化けしました。 A. 化けたまま保存した場合、読めなかった文字は失われていて戻りません。元の CSV があれば、方法1で開き直します。Shift_JIS の CSV 形式には 𠮷・絵文字が無く保存できないので、こうした文字を含むときは UTF-8 の CSV 形式を選びます。
Q. Mac で CSV が文字化けします。 A. Excel for Mac は[データ]→[データの取得]→[ファイルから]→[テキスト/CSV から]で取り込みます。Numbers なら、表の読み込みの設定の[区切り]→「テキストエンコーディング」で文字コードを選べます。
Q. Googleスプレッドシートで CSV が文字化けします。 A. インポートの画面に文字コードの項目が無いため、Shift_JIS の CSV はメモ帳・VS Code・nkf で UTF-8 に保存し直してからインポートします。
Q. 文字化けした CSV をまとめて直すには?
A. Linux・Mac は nkf -w8 元.csv > 新.csv を for 文で回し、Windows は PowerShell の Get-Content -Encoding 932 | Set-Content -Encoding utf8BOM を ForEach-Object で回します(方法4)。
Q. CSV の文字コードは何にするのがいいですか? A. Excel で開く人に渡すなら UTF-8(BOM 付き)、システム間の連携なら UTF-8(BOM なし)が一般的です。相手のシステムが Shift_JIS を指定している場合は CP932 で出力し、𠮷や絵文字が入らないかを事前に確かめます。
Q. BOM とは何ですか?
A. ファイルの先頭に付ける目印で、UTF-8 では EF BB BF の3バイト、UTF-16 リトル エンディアンでは FF FE です。Excel はこれを見て UTF-8 と判断します。プログラムによっては BOM を文字として読むため、読み込み側は utf-8-sig のような BOM 対応の読み方を使います。
Q. Shift_JIS と CP932 は同じですか? A. CP932 は、Shift_JIS に Windows 独自の文字(①・㈱・髙 など)を足した文字コードです。Windows で「Shift_JIS」と呼ばれているものの多くは CP932 です。プログラムでは「CP932」(Java は「Windows-31J」)を指定すると、Windows で作られたファイルと同じ範囲の文字を扱えます。
Q. エクセルファイル(.xlsx)の文字化けの直し方は?
A. 中身が CSV なのに拡張子だけ .xlsx になっていないかを確かめ、そうなら .csv に戻して開きます。ブックが壊れている場合は[ファイル]→[開く]→[開いて修復]を使います。
まとめ
- CSV の文字化けは、保存時と読み込み時の文字コードの違い。多くは開き直せば直る。気づいたら上書き保存しない
- Windows の Excel は [データ]→[テキストまたは CSV から]で文字コードを 65001(UTF-8)か 932に。列を「文字列」にしたいなら、拡張子を .txt にしてウィザードで開く
- 次からダブルクリックで開きたいなら、UTF-8(BOM 付き)で保存し直す。何本もあるなら nkf・PowerShell で一括変換
- 先頭の目印は UTF-8 の BOM が
EF BB BF、UTF-16 がFF FE。BOM の無い UTF-8 だけが、Excel のダブルクリックで化ける代表 - 「縺」「繧」が並ぶ → 中身は UTF-8、「�」が多い → 中身は Shift_JIS、半角カナが多い → EUC-JP
- UTF-8 を選んでも化けたままなら二重の化け。
�を含まない行はencode("cp932").decode("utf-8")で戻せた - 作る側は BOM 付き UTF-8(Python は
utf-8-sig)か .xlsx。Shift_JIS で出すなら CP932 / Windows-31J を指定し、𠮷・絵文字は保存できない
参考・出典
確認日はいずれも 2026年10月24日です。
- Microsoft サポート「Opening CSV UTF-8 files correctly in Excel」:https://support.microsoft.com/en-us/office/opening-csv-utf-8-files-correctly-in-excel-8a935af5-3416-4edd-ba7e-3dfd2bc4a032
- Microsoft サポート「テキスト (.txt または .csv) ファイルのインポートまたはエクスポート」:https://support.microsoft.com/ja-JP/Excel/get-started/import-or-export-text-txt-or-csv-files
- Microsoft サポート「テキスト インポート ウィザード」:https://support.microsoft.com/ja-JP/Excel/text-import-wizard
- Microsoft サポート「Excel でのデータのインポートと分析のオプション」(レガシ ウィザード・自動データ変換):https://support.microsoft.com/ja-JP/excel/data-import-and-analysis-options-in-excel
- Microsoft サポート「Import data from a CSV, HTML, or text file」(Excel for Mac):https://support.microsoft.com/en-us/excel/import-data-from-a-csv-html-or-text-file
- Microsoft サポート「Excel for Mac でデータをインポートおよび整形する (Power Query)」:https://support.microsoft.com/ja-JP/Excel/import-and-shape-data-in-excel-for-mac-power-query
- Microsoft サポート「Save a worksheet as a CSV file」:https://support.microsoft.com/en-us/office/save-a-worksheet-as-a-csv-file-8303b161-b926-4c01-acc5-c038a2a8958c
- Microsoft サポート「File formats supported in Excel for Mac」:https://support.microsoft.com/en-US/Excel/file-formats-supported-in-excel-for-mac
- Microsoft サポート「破損したブックを修復する」:https://support.microsoft.com/ja-jp/office/破損したブックを修復する-153a45f4-6cab-44b1-93ca-801ddcd4ea53
- Power Query ドキュメント「テキスト/CSV」:https://learn.microsoft.com/ja-jp/power-query/connectors/text-csv
- Microsoft Learn「コード ページ識別子」:https://learn.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers
- Microsoft Learn「Windows アプリで UTF-8 コード ページを使用する」:https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page
- PowerShell ドキュメント「Set-Content」(-Encoding):https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-content
- Apple「Numbers ユーザガイド(Mac)」CSV・テキストファイルの読み込み:https://support.apple.com/ja-jp/guide/numbers/tan9f3c54bdc/mac
- Apple「Numbers ユーザガイド(Mac)」Excelまたは別のファイルフォーマットに書き出す:https://support.apple.com/ja-jp/guide/numbers/tan3b922d4ad/mac
- Apple「Macのテキストエディットで設定を変更する」:https://support.apple.com/ja-jp/guide/textedit/txted1063/mac
- Google ドキュメント エディタ ヘルプ(スプレッドシートへのファイルのインポート):https://support.google.com/docs/answer/40608?hl=ja
- Visual Studio Code ドキュメント「Basic Editing」(File encoding support):https://code.visualstudio.com/docs/editing/codebasics
- 窓の杜(Windows 10 のメモ帳の UTF-8・BOM 対応の記事):https://forest.watch.impress.co.jp/docs/news/1157696.html
- Python ドキュメント「csv」:https://docs.python.org/3/library/csv.html
- Python ドキュメント「codecs」(utf-8-sig):https://docs.python.org/3/library/codecs.html
- nkf(Network Kanji Filter):https://github.com/nurse/nkf
- Homebrew Formulae「nkf」:https://formulae.brew.sh/formula/nkf
- PHP マニュアル「fputcsv」:https://www.php.net/manual/ja/function.fputcsv.php
- PostgreSQL 16 ドキュメント「COPY」:https://www.postgresql.org/docs/16/sql-copy.html
- MySQL 8.0 リファレンスマニュアル「SELECT ... INTO」:https://dev.mysql.com/doc/refman/8.0/en/select-into.html
- openpyxl ドキュメント:https://openpyxl.readthedocs.io/
- RFC 4180「Common Format and MIME Type for Comma-Separated Values (CSV) Files」:https://www.rfc-editor.org/rfc/rfc4180
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「CSV文字化けの直し方|エクセルで今すぐ直す手順とUTF-8で直らない原因」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。