XML :: Простая проблема кодирования - PullRequest
1 голос
/ 23 октября 2010

У меня есть 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 ]

3 голосов
/ 14 июня 2012

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'};
0 голосов
/ 23 октября 2010

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

...