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

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

以上です。色々調べてこれが最適解と思ったのですが、より適切な解決方法がありましたらコメントください。
XML::Simpleで取得したデータが引き起こす文字化けの対処方法: 小粋空間

「より適切」かどうかは分かりませんが、よりモダンな感じの解決方法を考えてみます。

考え方としては、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 powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。