文字エンコーディングが仲間外れのファイルを素早く見つける方法

プロジェクトに多人数が参加するようになると、なぜかプロジェクトの標準とは異なる文字エンコーディングのファイルがcommitされていることがあります。UTF-8で統一しているはずなのにShift_JISのファイルがある、なんて場合ですね。そこでメンバーの注意力不足を指摘したり、「だから***(自分の使っていないエディタの名前を入れてください)はダメなんだ」とかいう宗教論争に発展させたりというのでは不毛ですよね。簡単に気づく方法があればそれでいいんですよ。

方法は色々あると思いますが、今日はどこのご家庭にも必ずあるnkfを使ってみましょう。最近のnkfには–guessというオプションがあり、文字エンコーディングを推測してくれます。

$ nkf --guess hoge*.txt
hoge1.txt:EUC-JP (LF)
hoge2.txt:UTF-8 (LF)
hoge3.txt:BINARY

これを使えば、変な文字エンコーディングのファイルが隠れていないかどうかすぐにわかります。私はプロジェクトルートディレクトリで以下のようなコマンドを実行しています。

$ find . -name \*.php | xargs nkf --guess | perl -pe "s/.+://" | sort | uniq -c
 413 ASCII (LF)
   1 BINARY
   3 EUC-JP (LF)
  30 Shift_JIS (LF)
 481 UTF-8 (LF)

右側の文字列がnkfが推測した文字エンコーディングで、左側の数字は該当するファイル数です。この数字が小さいということは、仲間外れである可能性が高いということです。

どうやらUTF-8のプロジェクトのようですね。念のため補足しておくと、日本語っぽい文字が1文字も出現しないファイル(コメントも英語で書いてあるのでしょう)はASCIIと表示されます。この例では「*.php」というファイルだけを調べていますが、プロジェクトごとに工夫してください。

ところで上の例は何だか不安になる結果ですよね。と言っても、SJISで半角カナが混ざっているとか、@authorにヨーロッパ圏の人名が書いてあったりとかするとnkfは推測を誤ることが多いので、この結果だけで凹む必要はありません。むしろ、本当に問題があるのかどうか確認する事が大切です。

$ find . -name \*.php | xargs nkf --guess | egrep ":(Shift_JIS|EUC-JP|BINARY)"
./apps/**/*******/*********/actions/***.php:Shift_JIS (LF)
./apps/**/*******/*********/templates/***.php:Shift_JIS (LF)
(以下略)

Shift_JISとEUC-JPとBINARYのファイル名を表示させてみました。ファイル名を見てもバラバラで規則性は無さそうですし、うっかりミスの可能性が高そうです。実際にファイルの中身を見てみると、コメントがSJISなだけでプログラムの動作上は問題なさそうでした。とはいえ、今後の保守性を考えると怖いので直しておきたいですね。

文字エンコーディングの統一はどこのプロジェクトでも共通の悩みではないでしょうか。お困りの方がいらしたら試してみてくださいね!

コメント / トラックバックはありません

コメントする