fputcsv() で配列からCSVのテキストに変換してくれる。
配列中にダブルクォーテーションやカンマが入ってもOK。
//テストデータ
$arr = array(
array('1', '田中', 'あいうえお'),
array('2', '佐藤', 'かきくけこ'),
array('3', '山田', 'さしすせそ'),
array('4', '今"野', 'たち,つてと')
);
//出力用ヘッダ
header('Content-Type: text/csv; charset=Shift_JIS');
header('Content-Disposition: attachment; filename=data.csv');
//直接DL
$fp = fopen('php://output', 'w');
//配列ループ
foreach($arr as $arr_row){
mb_convert_variables('SJIS-win', 'UTF-8', $arr_row); //UTF-8をSJISに変換
fputcsv($fp, $arr_row); //配列をCSVに変換
}
fclose($fp);
CSVファイルをExcelで開くことを想定するとShift-JISにエンコードが必要。(Excel2010ならUTF-8のままでも文字化けせずに開いてくれるが、Excel2003で開かれないとも限らないので。。。)
実行するPHPファイルがUTF-8(BOM付き)だと、 mb_convert_variables() で正しくエンコードされないので注意。(BOM外し忘れててハマりました)
文字コードをShif-JISに変更してもファイル頭に「・ソ」がついてるから、BOMが残ったままShift-JISになってるんだろうな。
mb_convert_variables() は mb_convert_encoding() と違って返り値を拾わなくてOK。
0 件のコメント:
コメントを投稿