XML::SimpleのXMLinで、UTF-8 flagがonになるときとならないときがあるのはなぜでしょう?→解決
いつも教えてクンで申し訳ありません。PerlのUTF-8 flagに詳しい方に質問です。
以下のCGIをWindowsで動かしたときと、Freebsdで動かしたときに振る舞いが変わる理由を知りたいと思っています。
sample.cgi
#!/usr/bin/perl use strict; use warnings; use Encode; use Data::Dumper; use XML::Simple; my $ref = XMLin('input.xml'); print "Content-type: text/html; charset=UTF-8\n\n"; print '<pre>'; print Dumper($ref); if (utf8::is_utf8($ref->{name}->[0])) { print 'ON'; } else { print 'OFF'; } print '</pre>';
<?xml version="1.0" encoding="UTF-8" ?> <info> <name>ミルカさん</name> <name>テトラちゃん</name> </info>
Windows XP + ActivePerl v5.8.8 build 820 (Server), Windows XP + Firefox 2.0 (Client)
$VAR1 = { 'name' => [ 'ミルカさん', 'テトラちゃん' ] }; OFF
Freebsd + Perl v5.8.4 built for i386-freebsd-64int (Server), Windows XP + Firefox 2.0 (Client)
$VAR1 = { 'name' => [ "\x{30df}\x{30eb}\x{30ab}\x{3055}\x{3093}", "\x{30c6}\x{30c8}\x{30e9}\x{3061}\x{3083}\x{3093}" ] }; ON
ここでは、ファイルからの読み込みを行いましたが、YouTubeのAPIなどからの結果をXMLinでparseするときも同じ現象が起きています。
この件に関して何かご存じの方がいらっしゃいましたら、このエントリのコメント欄もしくは、feedbackの欄などで教えていただければ感謝です。
追記
何とすばやい応答…。fjkktkysさんから、$XML::Simple::PREFERRED_PARSERで明示的にパーサを指定する方法を教えていただきました。ありがとうございます。さっそく以下のようなプログラムで試してみました。
#!/usr/bin/perl use strict; use warnings; use Encode; use Data::Dumper; use XML::Simple; $XML::Simple::PREFERRED_PARSER = 'XML::Parser'; my $ref = XMLin('input.xml'); print "Content-type: text/html; charset=UTF-8\n\n"; print '<pre>'; print Dumper($ref); if (utf8::is_utf8($ref->{name}->[0])) { print 'ON'; } else { print 'OFF'; } print '</pre>';
すると、見事に上記の「Windowsでの結果」と「Freebsdでの結果」が以下のように一致しました!
$VAR1 = { 'name' => [ "\x{30df}\x{30eb}\x{30ab}\x{3055}\x{3093}", "\x{30c6}\x{30c8}\x{30e9}\x{3061}\x{3083}\x{3093}" ] }; ON
パーサが違っていたために異なる振る舞いになったということなのですね。fjkktkysさん、ご指摘ありがとうございます!
この後「では指定する前はどんなパーサが使われていたのか」などを調べようと思います。感謝です。