技術的雑談-Config::Simpleで文字化け
環境
- 確認したのはCentOS4.3、perl5.8.6
- Config-Simple-4.59
現象
- Config::Simple用のConfigファイルに日本語が含まれていると文字化けする。
原因
わかっている事は、Config::Simpleだけでは文字化けしないことです。
以下のScriptをtest.cgiとしてEUC-JPで保存します。
#!/usr/bin/perl use strict; use Config::Simple; print "Content-type: text/html;charset=EUC-JP\n\n"; print "<html><head><title>Test page</title></head><body>\n"; print "<h1>これはテストページです</h1>\n"; # Config File読み込み my $cfg = new Config::Simple('test.cfg') or print "<p> Config::Simple->error()</p>"; my $data1 = $cfg->param("data1"); my $data2 = $cfg->param("data2"); my $japanese = $cfg->param("japanese"); my $hoge = $cfg->param("hoge"); print "<p>\n"; print "[ Datas ]<br>\n"; print "data1 = ${data1}<br>\n"; print "data2 = ${data2}<br>\n"; print "japanese = $japanese<br>\n"; print "hoge = $hoge<br>\n"; print "</p>\n"; print "</body></html>\n"; $cfg->save(); 1;
ここに、以下のような「test.cfg」というファイルを用意します。(EUC-JPで保存します)
# test data data1 = abcdefg data2 = qqqqq japanese = ほげほげ hoge = ふがふが
このテストプログラムの出力は文字化けせずにちゃんと表示されます。
Scriptの最後で「save()」していても、ちゃんとConfigファイルは文字化けしない日本語で保存されます。
しかし、仮にこのプログラムが中で日本語出力する事を前提に作ってあり、「Multi byteなんたら〜」というwarnningがうっとおしくて「use encoding "euc-jp";」を使ったとします。
(上記リストの3行目と4行目の間に「use encoding "euc-jp";」を書き加えます。)
すると、1度目は正しい出力ができますが、2回目にScriptを呼び出すと、文字化けします。
原因はsave()で出力されたConfigファイルが文字化けしている為です。
対処
今の所、「use encoding "euc-jp";」を使わないのが唯一の解決っぽいです。
「use open IO => ":encoding(euc-jp)";」とかも同様にダメっぽいです。
もちろんsave()しないで「読みっぱなし」のConfigファイルなら大丈夫なのですが…。
履歴
2006/10/24 -- 初版
技術的雑談へ戻る