Я пишу Perl-скрипт, который должен извлечь некоторые данные из файла XML.
Сам файл XML кодируется с использованием UTF-8. Однако по какой-то причине то, что я извлекаю из файла, в конечном итоге кодируется как ISO-8859-1. В документации говорится, что все, что передается моим обработчикам, должно быть UTF-8, но это не так.
Парсер в основном что-то вроде этого:
my $parser = XML::Parser->new( Handlers => {
# Some unrelated handlers here
Char => sub {
my ( $expat, $string ) = @_;
if ( exists $data->{$curId}{$curField} ) {
$data->{$curId}{$curField} .= $string;
} else {
$data->{$curId}{$curField} = $string;
}
} ,
} );
Я пробовал следующие варианты фактического разбора:
- файл анализируется напрямую через
$parser->parsefile
, без параметров;
- файл анализируется напрямую через
$parser->parsefile
, с опцией ProtocolEncoding
;
- файл открывается с помощью
open( $handle , "<file.xml" )
, затем анализируется через $parser->parse
;
- открывается с помощью
open( $handle , '<:utf8' , "file.xml" )
, затем анализируется с помощью $parser->parse
.
Кроме того, я пробовал каждую версию с заголовком <?xml encoding="utf-8"?>
в файле и без него.
Во всех случаях то, что заканчивается в $data->{$curId}{$curField}
, кодируется с использованием ISO-8859-1.
Что я делаю не так?