僕はPerlで設定ファイルなどを扱うのにConfig::Generalをよく使う。もっと良いものがあるのかもしれないが、特に難しいところもなく、直感的に使えるので気に入っている。 ところが、設定ファイル中に日本語(UTF-8)があると、期待通りに動作をしてくれないことに気がついた。文字によっては化けたりするのだ。今まで困らなかったのが不思議なくらいだが、これまで設定ファイルに日本語を埋めたことがなかったのだろう。 この現象を回避するには、Config::Generalを初期化するときに、-UTF8オプションを渡してあげれば良い。 例えば、こんな感じ(たぶん)。

my $conf = Config::General->new(-ConfigFile => 'xxx.conf', -UTF8 => 1); my %config = $conf->getall;
ところが、少し古いConfig::Generalにはこの-UTF8オプションがない。例えばDebian 4.0の標準パッケージがそうなのだ。 しかたがないので、ファイルの中身をいったん読み込んで、読み込んだ内容をConfig::Generalに渡すことにした。これならうまく動いてくれる。
open(CONF, 'xxx.conf'); my $buf; while (<CONF>) { $buf .= $_; } close(CONF); my $conf = Config::General->new(-String => $buf); my %config = $conf->getall;
もっといい方法がありそうだと思いつつも、それほど時間がないし、わりとどうでもいいツールだし、なので動けばいいやということで妥協しつつ、備忘録をかねてエントリにしておいた。 ちなみに、呼び出す側のPerlスクリプトもUTF-8で書くことと、以下の記述を入れておくことを忘れずに。
use utf8; binmode STDOUT, ":utf8"; use open IN => ":utf8";
Perl世界のことはまだよく分からないので、添削・批評など大歓迎です。