お客さんに、CSVファイルを送付したかった。
ファイル数が多かったので、圧縮したZIPフォルダにまとめて送りたかったが、ファイル内の日本語部分が文字化けしてしまった。
その対策に手間取ったので備忘録。
作業環境
- PHP 7.4
- MAMP
ファイルの中身
結論
mb_convert_variables
を使ってCSVファイルに出力する。
課題
上記の環境で作成したPHPファイルに、データベースから必要なデータを抽出し、CSVファイルに落とし込む処理を実装した。
これによって作成されたCSVファイルをmac上で開くと問題なく表示される。
しかし、それをWindowsに送ってWindowsで開くと、日本語部分(正確には全角箇所?)が文字化けしてしまった。
原因
macでは文字コードがUTF-8となっており、WindowsではSJISとなっているためらしい。
macで作成したCSVファイルはそのままだとUTF-8となっているため、それをWindowsで開くとUTF-8に対応していないから日本語は文字化けしてしまうということ。
対策
mb_convert_variables
を使った。
CSVファイルに出力する際に、SJISで出力するようにした。
macでSJISでCSVを出力し、それをWindowsに送れば、Windowsでも問題なく日本語部分も表示された。
また、mac上でもSJISで出力したCSVファイルを問題なく表示させることができた。
// 文字コードShift-JISに変換して出力させる(Windowsでの文字化け対策)
mb_convert_variables('SJIS', 'UTF8', $data_ary, $csv_head);
$file = new SplFileObject(__DIR__ . "/./csv/$filename", 'w');
// CSVファイルに書き込む
$file->fputcsv($csv_head);
foreach ($data_ary as $line) {
$file->fputcsv($line);
}
参考