Webalizerで検索語の文字化けを解消
Webalizerではリンク元の情報を使って、検索サイトからどんなキーワードで自分のページにアクセスしてきたかが分かるようになっている。月別ページを開き、上のメニューから「検索語別」を選ぶと表示される。
だが、日本語の検索語を使った場合、この文字列がことごとく文字化けしてしまう。いったいどんなキーワードが指定されたのかさっぱり分からない。これを解消するための手順を見ることにしよう。

文字コードの変換を行う
検索語が文字化けしてしまうのは、Linuxが日本語の文字コードとしてEUCを使っているのに対し、大部分の検索サイトではUTF-8を使用しているためだ。つまり、文字化けしている部分の文字コードを変換すると、正しい日本語として表示されるようになる。
まずは文字コードを変換するスクリプトを作成する。viを開いて次のスクリプトを打ち込んで、/usr/local/binディレクトリあたりにconvert.plのような名前で保存する。次にこのスクリプトを実行できるようにchmodコマンドで属性を755に変更する。
#!/usr/bin/perl
use Jcode;
open (IN ,$ARGV[0]);
while (<IN>){
$_ =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Jcode::convert(\$_,euc);
print $_;
}
close (IN);
exit;
# chmod 755 /usr/local/bin/convert.pl
このスクリプトではJcode.pmという文字コードを変換するプログラムを呼び出している。このJcode.pmをインストールしておかないとスクリプトが動かない。次のような手順でインストールしよう。
# perl -MCPAN -e shell
このようにコマンドを打ち込むと英語のメッセージがずらずらと表示されるはず。これはネットワークから指定したプログラムを自動的にダウンロードしてインストールするための設定を行うもの。画面に英語で質問が表示されるが、すべてEnterキーを押して先に進んでいけばいい。途中で地域を聞かれるところがあるが「Asia」「Japan」の順に選ぶ。設定が終わるとcpan>と表示され、コマンドを入力できる状態になる。
cpan> install Jcode CPAN: Storable loaded ok LWP not available Fetching with Net::FTP: : : /usr/bin/make install -- OK cpan> exit Terminal does not support GetHistory. Lockfile removed. #
Jcodeをインストールするにはinstall Jcodeと入力する。英語のメッセージがずらずらと表示されるが、最後にmake install -- OKと表示されれば完了だ。exitと入力して終了しよう。
スクリプトをテストする
これでスクリプトを実行できる状態になった。うまく動いてくれるかテストしてみよう。
Webalizerの集計結果のファイルがあるディレクトリ(おそらく/home/httpd/html/webalizer)に移動して、文字化けしているファイルをスクリプトに読み込ませる。たとえば、ファイルの名前が「usage_200502.html」であれば次のようになる。
# /usr/local/bin/convert.pl usage_200502.html > temp.html
これは「convert.pl にusage_200502.htmlを読み込んで、その出力結果をtemp.htmlに保存する」という意味。エラーメッセージが出ずに終了したら、ブラウザで出力されたtemp.htmlファイルを開いてみよう。文字化けが解消しているはずだ。一部に文字化けが残っているが、とりあえずはよしとしよう。

集計結果を変換するスクリプトを作る
集計結果のファイルをひとつずつ変換していくのは大変なので、簡単に行えるスクリプトを作成する。問題なのは集計結果のHTMLを変換しても、次にWebalizerを実行するとHTMLファイルが上書きされてしまうところ。また元の文字化けに戻ってしまう。
解決方法としては、(1)アクセスログを変換してからWebalizerに読み込む、(2)Webalizerを実行するたびに集計結果を変換する、の2つがある。インターネットで検索してみると前者の方法をとっている人が多い。だが、自分の場合は文字化け対策をしないままWebalizerを使い続けてきたため、過去の集計結果がすべて文字化けしている。過去の結果も含めて簡単に文字化けを直せることから後者の方法をとることにした。
次のようなスクリプトを/usr/local/binディレクトリにwebalizer.shという名前で作成する。そして、先ほどと同じようにchmodコマンドで属性を755に変更する。
#!/bin/sh /usr/bin/webalizer > /dev/null for i in /home/httpd/html/webalizer/*.html do /usr/local/bin/convert.pl $i > $i.temp mv -f $i.temp $i done
太字になっている部分は各自の環境に合わせて集計結果のあるディレクトリに書き換えてほしい。このスクリプトの意味は、まずWebalizerを実行し、集計結果のファイルを先に作成したconvert.plで変換してから、最後に元のファイルに上書きするというもの。
Webalizerを実行するかわりに、この/usr/local/bin/webalizer.shを実行すれば、次からは文字化けのない形で検索語を見られるようになる。うまく動作することを確認したら、cronで自動実行するように登録しておくといい。