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”);

ダウンロードしたファイルを開いてみると、文字化けしていました。
20080513-mojibake.png
漢字コードとしてSJISを指定して開き直してみると、ちゃんとSJISで出力されているようですが、先頭に変な文字が入っているようです。
20080513-mojibake2.png
バイナリエディタで開いてみたら、16進で EF BB BF という文字コードが入っていました。
20080513-binary-editor.png
EF BB BF という文字列は、BOM(Byte Order Mark)と呼ばれ、UTF-8のときに付けられることがある文字列ということでした。
とはいえ、コードの中でBOMを出力するようなことはしていないので、アレコレ悩んでしまったのですが、PHPファイルの先頭にBOMが入っていることがあるという情報を見つけたので調べたところ、ビンゴでした。
20080513-binary-bom.png
PHPファイルの先頭にあるBOMがまず出力され、その後にプログラムからの echo が出力されたために、BOM付きのSJISファイルという奇妙なものが出来上がってしまっていたのでした。
PHPのソースファイルをBOMなしで保存し直してアップロードしたところ、BOMがつかなくなり、文字化けも解消されました。

カテゴリー: 開発関係

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください