データをファイルに記述する形式の一つに、CSVがあります。
データの表をカンマと改行で表現する形式で、非常にシンプルな形式なため書式などの設定はできませんが、あらゆるプログラムやアプリなどで共通して扱いやすい形式のため、例えばデータベースのデータの中身を一括で取り出して、Excelなどに読み込ませる、といったことができます。
このCSVをPHPで出力する際、頭を悩ませるのが文字コードの存在。
最近のOSはUTF-8の文字コードが使われることが多いのですが、UTF-8のままCSVファイルを出力してしまうと、Excelに読み込んだ際に日本語部分が文字化けするなどの問題が発生します。
この問題を解決するにはCSV化した際に指定した文字コードで吐き出させるようにするか、ダウンロードした後にファイル内の文字コードの変換をかけるかのいずれかしかないように思えますが、実はもっと簡単に解決する方法がありました。
PHPでExcelで開いても文字化けしないCSVを出力する – Qiita
$fp = fopen('php://output', 'w'); //ファイルストリームを開く
stream_filter_prepend($fp,'convert.iconv.utf-8/cp932'); //ストリームフィルタ指定
fputcsv($fp,csv化したい配列が入った変数); //配列をcsvとして書き込む処理
こちらはPHPでCSVを生成する際のサンプルコードで、上記の記事内のサンプルコードをもとに記述しています。
ミソなのは、2行目のstream_filter_prepend()です。
ファイルをfopen()関数で開き、ファイルストリームを開いたあと、ストリームフィルターとして文字コード変換の指定を行うことで、utf-8の文字列をCSVに吐き出してもクライント側で正しい文字コードでCSVが開かれるようになります。
CSVの文字コードでお困りの方は一度試してみてください。