CSVの文字化けを完全解決!文字コード・BOM・改行コードの基礎知識
CSVファイルを開いたら文字化けしていた、という経験は開発者なら誰しもあるのではないでしょうか。特に日本語を含むCSVは、文字コードの違いにより頻繁に問題が発生します。この記事では、文字化けの原因を根本から理解し、確実に解決するための知識をまとめます。
文字コードの基本:UTF-8 vs Shift_JIS
日本語の CSV ファイルで問題になる文字コードは、主に以下の2つです。
UTF-8
現在のWeb標準であり、世界中の文字を扱えるユニコードベースの文字コードです。Linux、macOS、モダンなWebアプリケーションではUTF-8がデフォルトです。1文字あたり1〜4バイトの可変長エンコーディングで、ASCII文字はそのまま1バイトで表現されます。
Shift_JIS(CP932)
WindowsのレガシーアプリケーションやExcelの旧バージョンで使われてきた日本語文字コードです。正確には、Windows環境では CP932(Microsoftによる Shift_JIS の拡張)が使われており、一部の機種依存文字(丸数字、ローマ数字など)はCP932でしか扱えません。
なぜ文字化けが起きるのか
文字化けの根本的な原因は単純です。ファイルを書き出したときの文字コードと、読み込むときの文字コードが一致していないためです。
例えば、Webアプリケーションが UTF-8 で CSV をエクスポートし、ユーザーが Excel で開くと文字化けします。これは Excel が日本語環境ではデフォルトで Shift_JIS(CP932)としてファイルを解釈するためです。
BOM(Byte Order Mark)の役割
BOM とは、ファイルの先頭に付与される数バイトのマーカーで、文字コードを示す目印です。UTF-8 の BOM は 0xEF 0xBB 0xBF の3バイトです。
重要なポイントは、Excel で UTF-8 の CSV を正しく開くには BOM が必要ということです。BOM なしの UTF-8 CSV を Excel で開くと、Shift_JIS として解釈され文字化けします。
// PHP で BOM 付き UTF-8 CSV を出力する例
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="data.csv"');
// BOM を出力
echo "\xEF\xBB\xBF";
$fp = fopen('php://output', 'w');
fputcsv($fp, ['名前', 'メール', '部署']);
fputcsv($fp, ['田中太郎', 'tanaka@example.com', '開発部']);
fclose($fp);
# Python で BOM 付き UTF-8 CSV を出力する例
import csv
with open('data.csv', 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['名前', 'メール', '部署'])
writer.writerow(['田中太郎', 'tanaka@example.com', '開発部'])
ただし、BOM には注意点もあります。一部のプログラムやシェルスクリプトでは BOM を不正な文字として扱い、エラーの原因になることがあります。APIのレスポンスやプログラムで処理する CSV には BOM を付けない方が安全です。
改行コードの問題
CSVの文字化けと並んでよくある問題が改行コードの違いです。
- CRLF(
\r\n)— Windows 標準 - LF(
\n)— Linux / macOS 標準 - CR(
\r)— 旧 Mac OS(現在はほぼ使われない)
RFC 4180 では、CSV の改行コードは CRLF と定められています。しかし実際には、多くのツールが LF のみの CSV も問題なく処理できます。問題が起きやすいのは、Excel や一部のレガシーシステムです。
改行コードの確認にはコマンドラインツールが便利です。
# file コマンドで確認
file data.csv
# 出力例: data.csv: UTF-8 Unicode (with BOM) text, with CRLF line terminators
# xxd で先頭バイトを確認(BOM の有無)
xxd data.csv | head -3
実践的な解決チャート
CSVの用途に応じた最適な設定を以下にまとめます。
| 用途 | 文字コード | BOM | 改行コード |
|---|---|---|---|
| Excel で開く | UTF-8 | あり | CRLF |
| プログラムで処理 | UTF-8 | なし | LF |
| レガシーシステム連携 | Shift_JIS (CP932) | なし | CRLF |
| API レスポンス | UTF-8 | なし | LF |
テスト用CSVファイル
自分のアプリケーションがさまざまな文字コードのCSVを正しく処理できるか確認するには、DevLab のテスト用ファイルをお使いください。
- 文字コード別テスト用CSVファイル — UTF-8(BOM付/なし)、Shift_JIS、EUC-JP など
- 改行コード別テストファイル — CRLF、LF、CR の各種ファイル
- CSV テストファイル一覧 — 各種サイズの CSV ファイル
まとめ
CSVの文字化け問題は、文字コード・BOM・改行コードの3つの要素を正しく理解すれば確実に解決できます。Excel向けにはBOM付きUTF-8でCRLF改行、プログラム処理にはBOMなしUTF-8でLF改行が基本です。DevLab の各種テストファイルを使って、自分のアプリケーションが各パターンを正しく処理できるか検証してみてください。