おはこんばんにちは、いい年してモンハンしちゃってるモリです。
さて、今回はCMSの1機能としてよくあるCSVダウンロード機能に関する記事を書きたいと思います。
PHPで生成したCSVをエンドユーザーがダウンロードしてエクセルで開いたら文字化けしてる!って
事を無くす為のやり方です。
結論から言うとファイルの先頭にBOMを付与する事で文字化けを回避させることが出来ます。
エクセルにUnicodeと識別させるために付与します。
これがあるとエクセルは自動的に判別してくれます。
SIJISに変換する方法もありますが、UTF8のまま文字化け対応させるやり方です。
BOMなしのPHPソース
01 02 03 04 05 06 07 08 09 10 11 12 13 | 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を付与します。
1 | fwrite( $fp , '\xEF\xBB\xBF' ); |
BOMありバージョンで見てみるとちゃんと読み込めていますね。
おまけ:BOMありのPHPソース
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | 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 ); |
では。。。