XML::Simpleで文字化けしない方法

普段、MovableTypeのプラグインでお世話になっている「小粋空間」さんが、意外なところで躓いていた。

考え方としては、XML::SimpleのXMLinが内部文字列を返すのであれば、スクリプトを内部文字列化してやれば解決するのでは、という感じです。 まずは、スクリプトを「use utf8;」してしまいます。 そうすると、スクリプトに書かれている文字はPerlの内部空間と同じ状態(内部文字列)になります。 で、このまま出力すると「Wide Character」の問題が出ますので、出力時にはutf8でエンコードしてやります。 それを踏まえて書きなおすと以下のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
use strict;
use utf8;
binmode STDOUT => ":utf8";
use CGI;
use XML::Simple;
my $q = new CGI;
print $q->header(-charset=>'utf-8');
print $q->start_html;
my $xml = XMLin('foo.xml');
my $name = $xml->{name};
print <<EOF;
<form method="post" action="hoge.cgi">
名前:<input type="text" id="hoge" name="hoge" value="$name" />
<input type="submit" name="submit" value="送信" />
</form>
EOF
print $q->end_html;

これで文字化けはしません。

Comments

comments powered by Disqus