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'});

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


person pacefist    schedule 23.10.2010    source источник


Ответы (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'};
person gfunk    schedule 13.06.2012
comment
OMG - это делало мою голову! Спасибо за подсказку (наконец-то заработало) - person Andrew Newby; 03.06.2015

Шестнадцатеричный FB (декабрь 251) представляет собой код ASCII символа «û». Не могли бы вы уточнить, что вы ожидали получить в структуре данных, что привело бы вас к выводу, что полученное вами «повреждено»?

person DVK    schedule 23.10.2010
comment
Мой скрипт анализирует некоторый xml (содержащий такие символы) и генерирует другой xml. Этот другой xml, казалось, был искажен, потому что синтаксический анализатор не смог обработать эти символы. - person pacefist; 23.10.2010
comment
Я думал, что xmlin вернул текст в utf-8 и сгенерировал свой собственный xml с помощью 'encoding = utf-8' - person pacefist; 23.10.2010