僕は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世界のことはまだよく分からないので、添削・批評など大歓迎です。