CSVの文字化けはなぜ起きる?

CSVファイルを開いたら「繧ウ繝ウ繝励Μ繝シ繝医」のような意味不明な文字列になった経験はありませんか?

これは文字エンコーディングの不一致が原因です。ファイルを保存した時のエンコーディングと、開く時に想定されるエンコーディングが異なると文字化けが発生します。

エンコーディングとは?

コンピュータは文字を「数値」として保存しています。同じ数値でも、エンコーディング方式によって対応する文字が変わります。

  • Shift_JIS: Windowsの日本語環境でデフォルト。Excelが生成するCSVはこれ
  • UTF-8: macOS、Linux、Webの標準。Googleスプレッドシートはこれで出力
  • EUC-JP: 古い業務システムで使われることがある
  • UTF-16: Excelが「Unicode テキスト」として保存する時の形式

よくある文字化けパターンと原因

パターン1: ExcelでUTF-8のCSVを開くと文字化け

症状: GoogleスプレッドシートやシステムからダウンロードしたCSVをExcelで開くと文字化けする

原因: ExcelはBOM(Byte Order Mark)なしのUTF-8ファイルをShift_JISとして開いてしまう

解決方法:

  1. CSV文字化け修復ツールでUTF-8(BOM付き)に変換してからExcelで開く
  2. Excelの「データ」→「テキスト/CSVから」で開き、エンコーディングを「UTF-8」に指定する

パターン2: MacとWindows間でCSVを共有すると文字化け

症状: Macで作成したCSVをWindowsのExcelで開くと文字化け(またはその逆)

原因: macOSはUTF-8がデフォルト、WindowsのExcelはShift_JISがデフォルト

解決方法:

  1. CSV文字化け修復ツールで変換する
  2. 保存時にUTF-8 BOM付きで保存する(Excelの「名前を付けて保存」→「CSV UTF-8」を選択)

パターン3: 業務システムからエクスポートしたCSVが文字化け

症状: 基幹システムや会計ソフトからエクスポートしたCSVが読めない

原因: 古いシステムはEUC-JPやISO-2022-JPでデータを出力する場合がある

解決方法:

  1. CSV文字化け修復ツールにドラッグ&ドロップするだけで自動検出・変換される

BOM(Byte Order Mark)とは?

BOMはファイルの先頭に付与される特殊なバイト列で、そのファイルがUTF-8であることをソフトウェアに知らせます。

  • BOMあり: EF BB BF がファイル先頭に付く → Excelが正しくUTF-8として認識
  • BOMなし: ファイル先頭にマークがない → Excelが日本語環境ではShift_JISと誤認識

重要: GoogleスプレッドシートからダウンロードしたCSVはBOMなしのUTF-8です。そのままExcelで開くと文字化けします。CSV文字化け修復ツールはBOM付きUTF-8で出力するため、変換後はExcelでも問題なく開けます。

プログラマー向け: コマンドラインでの文字化け対策

ファイルのエンコーディングを確認

file -I data.csv
# 出力例: data.csv: text/csv; charset=shift_jis

nkfで変換(Linux/Mac)

nkf -w --overwrite data.csv  # UTF-8に変換
nkf -w --bom data.csv > data_bom.csv  # BOM付きUTF-8

Pythonで変換

with open('data.csv', 'rb') as f:
    raw = f.read()
text = raw.decode('shift_jis')  # or 'euc-jp'
with open('data_utf8.csv', 'w', encoding='utf-8-sig') as f:
    f.write(text)

まとめ

状況原因解決方法
ExcelでCSVが文字化けBOMなしUTF-8をShift_JISとして開いているBOM付きUTF-8に変換
Mac↔Windows間で文字化けデフォルトエンコーディングの違いUTF-8 BOM付きで統一
古いシステムのCSVEUC-JP/ISO-2022-JPで出力UTF-8に変換

いずれの場合も、CSV文字化け修復ツールにファイルをドラッグ&ドロップするだけで、エンコーディングを自動検出してUTF-8(BOM付き)に変換できます。サーバーにファイルを送信しないので、機密データを含むCSVでも安心です。