PHPでCSVを吐き出すと文字化けする問題の対処法

  • 2020年10月23日
  • 2020年10月23日
  • PHP

データをファイルに記述する形式の一つに、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の文字コードでお困りの方は一度試してみてください。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG