bogofilter のデータベースのエンコーディングについて

bogofilter は何も考えずに使い始めると unicode でデータベースを作ってくれます。

$ bogoutil -w ~/.bogofilter/wordlist.db .ENCODING
spam   good
.ENCODING                           2      0

ここで spam の下の値は 1=raw、2=unicode を意味します。 この例では unicode のデータベースになっていることがわかります。

しかし、これまで紹介した手順では EUC テキストを bogofilter に喰わせているわけで、 bogofilter はそれを iso-8859-1 と信じて unicode に変換してデータベースに格納してしまうのです。

ですので、FAQ 等に載っているように "bogoutil -d" でデータベースを見ようとしても日本語が化けて困ってしまうのです。 とりあえず以下のコマンドを打てば Cygwin 環境ではきちんと日本語も SJIS で出力され、その内容を確認できます。 (最後の nkf で出力エンコーディングを調整してください)

$ bogoutil -d ~/.bogofilter/wordlist.db | iconv -c -f utf-8 -t iso-8859-1 | nkf -Es

たまにこうしてデータベースの内容を見てみると色々な発見ができるのではないでしょうか?

さて、わざわざ変換に手間をかけるならば raw でいいではないか、ということになります。 unicode から raw にデータベースを変換するやり方は先の FAQ に出ているのでこれを参考に raw encoding のデータベースファイルを作ります。

$ cd ~/.bogofilter
$ bogoutil --unicode=no -m wordlist.db
$ bogoutil -w wordlist.db .ENCODING
spam   good
.ENCODING                           1      0

これで "bogoutil -d" の結果が EUC で出力されるようになりました。

なお、iconv を使った変換もしてみましたが、.ENCODING の値は 2 のままでした。 ただし、データベースの内容は raw (=EUC) になってはいるようです。 それ以上突っ込んだ確認はしていません。