モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

DebugKitの表示が崩れた理由とUTF-8のBOM

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付きになってしまったのかがわかりました。