xmlhack.ru logo
>> статьи на xmlhack.ru

XML::Twig и русская кодировка

Автор: Михаил Соловьев
Опубликовано на xmlhack.ru (14.07.2004, рус.): http://xmlhack.ru/texts/04/perl.xml.twig/XML_Twig_rus.html
В закладки:   Del.icio.us   reddit

Проблемная область: Применение 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. Всё! Проблема полностью решена.

Ссылки по теме



Copyright © Авторы и переводчики статьи