おはこんばんにちは、いい年してモンハンしちゃってるモリです。
さて、今回はCMSの1機能としてよくあるCSVダウンロード機能に関する記事を書きたいと思います。
PHPで生成したCSVをエンドユーザーがダウンロードしてエクセルで開いたら文字化けしてる!って
事を無くす為のやり方です。
結論から言うとファイルの先頭にBOMを付与する事で文字化けを回避させることが出来ます。
エクセルにUnicodeと識別させるために付与します。
これがあるとエクセルは自動的に判別してくれます。
SIJISに変換する方法もありますが、UTF8のまま文字化け対応させるやり方です。
BOMなしのPHPソース
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=sample.csv");
$fp = fopen('php://output','w');
$data = array(
array('項目1','項目2','項目3','項目4'),
array('データ1','データ2','データ3','データ4'),
array('データ5','データ6','データ7','データ8'),
array('データ9','データ10','データ11','データ12')
);
foreach($data as $output){
fputcsv($fp, $output, ',','"');
}
fclose($fp);
さっきのソースのデータ書き込み前にBOMを付与します。
fwrite($fp, '\xEF\xBB\xBF');
BOMありバージョンで見てみるとちゃんと読み込めていますね。
おまけ:BOMありのPHPソース
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=sample.csv");
$fp = fopen('php://output','w');
fwrite($fp, "\xEF\xBB\xBF");
$data = array(
array('項目1','項目2','項目3','項目4'),
array('データ1','データ2','データ3','データ4'),
array('データ5','データ6','データ7','データ8'),
array('データ9','データ10','データ11','データ12')
);
foreach($data as $output){
fputcsv($fp, $output, ',','"');
}
fclose($fp);
では。。。




















