XML:: Простая проблема кодирования

У меня есть xml-файл, который я хочу проанализировать:

<?xml version="1.0" encoding="UTF-8" ?>
<tag>û</tag>

Это отлично разбирается firefox. Но XML::Simple портит некоторые данные. У меня есть Perl-программа, как это:

my $content = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
$content .= "<tag>\x{c3}\x{bb}</tag>\n";

print "input:\n$content\n";

my $xml = new XML::Simple;
my $data = $xml->XMLin($content, KeepRoot => 1);

print "data:\n";
print Dumper $data;

и получить:

input:
<?xml version="1.0" encoding="UTF-8" ?>
<tag>û</tag>

data:
$VAR1 = {
          'tag' => "\x{fb}"
        };

это не то, что я ожидал. Я думаю, что есть некоторые проблемы с кодированием. Я делаю что-то неправильно?

UPD: я думал, что XMLin вернул текст в utf-8 (в качестве ввода). Только что добавлен

encode_utf8($data->{'tag'});

и это сработало

2 ответа

XML::Simple непостоянен.

Он вызывает Encode::decode('UTF-8',$content), который переводит ваш UTF-8 в нативный.

Сделай это:

my $content_utf8 = "whatevér";
my $xml = XMLin($content_utf8);
my $item_utf8 = Encode::encode('UTF-8',$xml->{'item'});

Это тоже работает, но рискованно с двойным кодированием:

my $content_utf8 = "whatevér";
my $double_encoded_utf8 = Encode::encode('UTF-8',$content_utf8);
my $xml = XMLin($double_encoded_utf8);
my $item_utf8 = $xml->{'item'};

Шестнадцатеричный FB (dec 251) - это код ASCII символа "û". Не могли бы вы рассказать о том, что вы ожидали получить в структуре данных, из-за чего вы пришли к выводу, что то, что вы получили, было "повреждено"?

Другие вопросы по тегам