2008年05月13日

PHPで出力したCSVが文字化け

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がつかなくなり、文字化けも解消されました。


posted by はるこち at 12:02| Comment(0) | TrackBack(0) | 開発関係 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。