- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!技術的雑談-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 -- 初版
[[技術的雑談]]へ戻る
!!突っ込み
{{comment}}
[[技術的雑談]]へ戻る
{{trackback}}
[[技術的雑談]]へ戻る