🐘

PHPのCSV文字化け対策

に公開

はじめに

PHPユーザーのみなさんこんにちは。
PHPでCSVファイルを出力するとき、日本語が文字化けすることあると思います。
特にExcelでCSVファイルを開くとき、エンコーディングが正しくないと
意図していない表示になってしまいます。

そこでこの記事ではCSV出力時に注意すべきことまとめます。

結論

関連するファイルのエンコードがUTF-8 with BOMとなっていないか確認しましょう!
CSV出力処理が記述されているファイルだけでなくインクルードされているファイルも確認する必要があります。
PHPではrequire_once()などで読み込んだファイルにBOMが含まれていると
インクルードしているファイルのエンコードがたとえUTF-8としていても
UTF-8 with BOMとなってしまいます!

解決手順

これ以降は実際に実務でCSVの文字化けを解決していく様子を備忘録として残します・

  1. DBから取得したい時点で文字化けしている可能性を考え、デバックを実施するが、問題なし
  2. PHPのエンコード関数が上手く言っていない?
    関数通過直後のエンコーディングを確認するが、問題なし
  3. 出力されたCSVファイルのエンコードを確認すると、
    「uft-8 with BOM」となっていることに気付く。
    ChatGPTに確認してみるとPHPファイル自体にutf-8 with BOMになっていると
    そこから出力されるファイルのエンコードが強制的にBOMつきになる。
    しかし、CSV出力処理が記述されているPHPファイルのエンコードはutf-8。
  4. 再びChatGPTに確認すると、インクルードされているファイルの中にBOM付きPHPファイルが
    あると、それ以降のファイルもBOM付きになるらしい。
  5. 全てのファイルのエンコードを確認すると、「setting.php」といういかにも全てのファイルが
    読み込んでいそうなPHPファイルのエンコードがBOM付きであることを発見。
  6. 「setting.php」のエンコードをutf-8に変更すると、出力されるCSVファイルのエンコードも
    適切になった!!無事解決!!!

Discussion