結城浩のはてなブログ

ふと思いついたことをパタパタと書いてます。

XML::SimpleのXMLinで、UTF-8 flagがonになるときとならないときがあるのはなぜでしょう?→解決

いつも教えてクンで申し訳ありません。PerlUTF-8 flagに詳しい方に質問です。
以下のCGIWindowsで動かしたときと、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>';

input.xml (UTF-8)

<?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

ここでは、ファイルからの読み込みを行いましたが、YouTubeAPIなどからの結果を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さん、ご指摘ありがとうございます!
この後「では指定する前はどんなパーサが使われていたのか」などを調べようと思います。感謝です。