開発しているシステムで CSV ファイルをダウンロードさせる機能があります。PHP コードは UTF-8 で記述しているのですが、CSV ファイルは Shift-JIS で出力したいので、ダウンロードさせるときに変換をしています。
その機能で急にファイルの先頭に勝手に BOM が付いてしまうというバグが発生しました。

しかも自分のローカルの開発環境では発生せずに、テスト機だけで起こるという現象でした。

ダウンロードする処理は何も修正していないので、最初は出力するデータに問題があるのかと思い、色々試したみたが出力するデータには関係ないことが分かった。

結局理由はある PHP ファイルが BOM 付きの UTF-8 で保存されていたためでした。要はCSV を出力する前にこの BOM が出力されていたために起こっていました。

これは PHP のエラーを出力させていればすぐに分かったのですが、ローカルの開発環境は notice エラーまで出力させているのですが、発生していたテスト機では表示させていないためですね。header 出力よりも先に BOM が出力されているので Warning が出ますので。

BOM がついたのは多分 Windows のメモ帳でファイルを保存したのでしょう。メモ帳で UTF-8 を保存すると BOM をつけるようです。

同様に困っている方がいましたので参考までに解答しておきました。
csvファイルをブラウザで書き出すと3byteのBOMが付いてる – PHPプロ!Q&A掲示板

関連する投稿