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 символа "û". Не могли бы вы рассказать о том, что вы ожидали получить в структуре данных, из-за чего вы пришли к выводу, что то, что вы получили, было "повреждено"?