CakePHPで書いてるWebアプリでDebugKitを使っているのですが、いつの頃からかDebugKitの表示がちょっとかわってしまい、Tool Barを閉じたり開いたりすることができなくなってしまいました。
それほど問題ではなかったので放置してたのですが、ちゃんと調査したらこれが予想外の理由でした。
どうもjQueryがまともに動いてない感じだったのでFirebugで確認すると、DebugKitが使っているjquery.jsとjs_debug_toolbar.jsでエラーが出ていて、ちゃんと動いていない状況でした。
でそれがどうも、どちらもファイルの最後の2文字くらいだけが欠けているようなのです。
どうしてこんな変な出力の仕方をしてしまっているのか、eclipseからデバッガで延々追ってみたのですがよくわからず…
そこでgitでまともにDebugKitのTool Barが表示されていた時まで戻って、どこでおかしくなっているのかを探してみました。
すると他のコミットに混じって、bootstrap.phpの頭の"<?php"だけの行がなぜか同じ"<?php"に変更されているという変なログがありました。
その時は気に留めずにコミットしてしまっていたのですが、これはすごい怪しい…
そこで、その変更前と変更後のファイルとを比較してみました。
テキストで見ると全く同じに見えるのですが、Stirlingというバイナリエディタで見てみると、変更後のダメなほうのファイルはファイルの先頭に
EE BB BF
が入っていることがわかりました。
これはBOMといって「テキストデータがUTF-8で符号化されていることの標識として、データの先頭にEF BB BFを付加することが許される」*1コードなのですが、どうもこのBOMが影響して文字数を2文字ぶん間違ってしまうようでした。
ただ、DebugKitのjquery.js等にBOMが付いているわけではなく、bootstrap.phpに付いていたBOMが影響してしまうというのが不思議ですが…
Emacsで開いてBOMを取ろうとしてもうまくいかなかったため、なにか手軽にBOMだけ削除出来ないかと思ってぐぐったところ、「file」コマンドで確認して「uconv」コマンドで削除可能だとわかりました。
コマンドラインでUTF-8テキストのBOMを追加したり削除したりする | skmks
http://unicus.jp/skmk/archives/498
$ file *.cpp foo.cpp: UTF-8 Unicode text bar.cpp: UTF-8 Unicode (with BOM) text
uconv -f utf-8 -t utf-8 --remove-signature bar.cpp > bar_nobom.cpp
しかしまさかこんなのが影響して表示が崩れてたとは…
これはなかなか気がつけませんね。
(追記)
UTF-8のファイルを勝手にBOM付きにしてしまう犯人
http://d.hatena.ne.jp/stealthinu/20131220/p1
なぜBOM付きになってしまったのかがわかりました。