Проблемная область: Применение Perl-модуля XML::Twig для обработки XML в CGI-скриптах. Кодировка.
Каждый, кто начинает осваивать XML::Twig, сразу сталкивается с проблемой, связанной с русскими кодировками. Но создатели модуля включили в него методы, которые легко устраняют эту проблему, что позволяет свободно использовать русские кодировки windows-1251, cp866 (DOS) и koi8-r (UNIX). Сразу же рассмотрим пример, после чего всё станет понятно.
Вот наш XML-файл myfile.xml, с которым мы будем работать:
myfile.xml
<?xml version="1.0" encoding="windows-1251"?>
<doc>
<title>Заголовок на русском</title>
</doc>
В самой первой строке указывается кодировка документа: encoding="windows-1251". Для того чтобы XML::Twig смог разобрать этот документ, ему нужен файл с картой кодировки (англ: encmap). Для русских кодировок имеются соответствующие файлы: windows-1251.enc, ibm866.enc, koi8-r.enc [скачать]; их нужно скопировать туда же, где находятся остальные .enc файлы. Найти эту папку можно набрав команду:
find /usr -name *.enc -print
Рассмотрим скрипт:
try.pl
#!/usr/bin/perl -w
use XML::Twig;
my $file = 'myfile.xml';
my @twig_options = (keep_encoding => 1);
my $twig = XML::Twig->new(@twig_options);
$twig->parsefile($file);
my $root = $twig->root;
$title = $root->first_child('title');
$str = $title->text;
print $str;
После того как скрипт успешно разобрал XML файл с помощью метода parsefile и ".enc"-файла, мы можем далее делать всё что угодно с нашим XML с помощью методов XML::Twig. При этом весь текст файла будет перекодирован в стандартную кодировку ISO-X...X, что нам совершенно не нужно. Чтобы избежать этого, надо при создании объекта XML::Twig методом new установить опцию keep_encoding => 1, через массив опций — в примере: @twig_options. Всё! Проблема полностью решена.