PHPで出力したCSVが文字化けするという現象が発生してしまいました。
前提条件として、漢字コードがちょっと複雑なことになっている環境です。
データベース(PostgreSQL) = EUC-JP
ソースコード(php) = UTF-8
出力ファイル(csv) = SJIS
PHPプログラムの先頭で以下のようにヘッダーを出力してCSVをダウンロードできるようにしました。
header(“Content-Type: application/octet-stream”);
header(“Content-Disposition: attachment; filename=datafile.csv”);
ダウンロードしたファイルを開いてみると、文字化けしていました。
漢字コードとしてSJISを指定して開き直してみると、ちゃんとSJISで出力されているようですが、先頭に変な文字が入っているようです。
バイナリエディタで開いてみたら、16進で EF BB BF という文字コードが入っていました。
EF BB BF という文字列は、BOM(Byte Order Mark)と呼ばれ、UTF-8のときに付けられることがある文字列ということでした。
とはいえ、コードの中でBOMを出力するようなことはしていないので、アレコレ悩んでしまったのですが、PHPファイルの先頭にBOMが入っていることがあるという情報を見つけたので調べたところ、ビンゴでした。
PHPファイルの先頭にあるBOMがまず出力され、その後にプログラムからの echo が出力されたために、BOM付きのSJISファイルという奇妙なものが出来上がってしまっていたのでした。
PHPのソースファイルをBOMなしで保存し直してアップロードしたところ、BOMがつかなくなり、文字化けも解消されました。
0件のコメント