2006年3月11日の日記の1番目の記事へのコメント
■Perlでrefererのデコード
apacheのログで気になるのはやっぱreferer.特にどんなキーワードで自分のコンテンツに訪れているのか結構気になったりします.そんなことから,これまでawkとかsedとかiconvとか使ったシェルスクリプト書いて適当にログを整形して表示させてみたりしていたんですが,何かやっぱ遅いのと,他でもちょっと使えるようにしたかったんで,Perlで書き直してみることにしてみました.
URL見てサーチエンジンごとに正規表現で検索ワード切り出して云々というのはPerlなんで普通に正規表現書くだけで済むのでとっても簡単.問題はURLをデコードした後の文字コードの変換なんですが,これもEncodeなるPerl同梱のモジュール使って文字コードの変換とかできちゃうんですね.楽だ.
ちまちま書いてみたところ,手元のログの大部分は問題なく処理できました.ただ,一部,refererのURLに文字コード情報が入ってない場合の文字コードの推測処理がどうにもうまくいきません.あちこちで紹介されてるサンプルコードをそのまま動かしてるつもりなんですが,なぜか本来euc-jpやsjisなものがutf8として認識されちゃいます(´・ω・).
仕方ないので場当たり的に検索エンジンのページの文字コードにあわせて決め打ちでデコードするようにして(exciteならsjis,infoseekならeuc-jpみたいな感じで),更に検索ボタンのvalue値のURL値を元に元の文字コード推測するようにしてみたりしてやったところ,手元のログに関してはひとまず正常にデコードできるようになりました.うーん,でもやっぱそれでもダメな場合は自動判別したいところです.シェルスクリプトではiconv使わずにnkfの自動推測に頼ってたんで楽だったんですけどねー.phpならこの辺問題ないのかなー・・・ってここまで書いて気づいたんですが,他に使いまわすことも考えるとphpで書いた方が良かったか(;´Д`)?
あ,あと,たまに混じってる「"\x93\x8c\x95\xfb\x89i\x96\xe9\x8f\xb4"」みたいなやつもうざいですね.ブラウザが悪いのか何なのかよくわかりませんけど,こっちは大概sjis?
[コメントを書く]
2006年3月11日の日記の1番目の記事へのコメント
yazさんのところで見たのかな.
http://www.cc.rim.or.jp/~yaz/patch.html
にあるlibguessはGaucheのコードを使ってますね.