金曜日, 8月 27, 2010

もうUTF8のBOMでもう悩まないためのまとめ

「今まで正常にダウンロードできたCSVが文字化けするようになったよ><。とりあえず助けろ。」
というヘルプ要望あり。

さっそく調べると、今までSJISであったらしきCSVファイルがUTF8になっている

ダウンロード時のHTTPヘッダ正常に見える
NFS上で保存されている一時CSVファイルはSJISで正常の模様
そのためDBから情報引っ張ってきてCSV作成する時ではなく落とす時だと考え、PHPのプログラムを調べる

が、header()関数とreadfile()関数でフツーに落としているだけなので特におかしさ/気づきは感じられず
SJISをUTF8に変換している様子はない

CSVファイルをエディターを通して眺めていると、BOMがついていることにふと気付く
ここがひっかけで正常なSJISファイルにUTF8のBOMがついていたためUTF8に見えただけだった。

もしわからなければ
この方や他の方も書いてあるように

function delete_bom($str)
{
if (ord($str{0}) == 0xef && ord($str{1}) == 0xbb && ord($str{2}) == 0xbf) {
$str = substr($str, 3);
}
return $str;
}

などで対応すればよいのかもしれないが根本解決がベター

以前もBOMが入ってしまう、という障害に遭遇した気がするのだが、解決したことは自分でも病気なんじゃないかと思うぐらい忘れてしまうので詳細思いだせず。

http://www.sbirobo.com/2007/12/remove-bom-from-utf8-document.html
http://takesita.seesaa.net/article/96553793.html
http://www.okushin.co.jp/kodanuki_note/2009/09/csv.html
http://takesita.seesaa.net/article/96553793.html
あたりを参考に、
$ find /path/to/project -type f -not -name *.gif -not -name *.jpg
で得られた全ファイルに対して
$ od -t x1 -N 3 UedeEtaFiles
したところ、subversion内にBOM付きのファイルがみつかる。
その中で設定ファイルが含まれていてここからBOMを取り除いて反映したところ問題解決

問題が解決してすっきり、それ以上に関係者が安堵し喜んでくれたのがよかったよかった


好きな出版社のシリーズだし時間あればこのあたりも読んでみたいかも
プログラマのための文字コード技術入門
プログラマのための文字コード技術入門