Forum Webscript.Ru
Программирование => Perl => Тема начата: flamey от 24 Ноября 2006, 00:18:53
-
Хочу считывать курсы валют с сайта нашего ЦБ и с сайта нац банка одной центрально-европейской страны.
Оказалось что у XML::Parser\'а нет файла конфигурации для работы с кодировкой CP1251, и каждый скрипт он тормозит с ошибкой что нет такого файла. С CP1250 всё работает. Нужного файла нет на CPAN\'е, есть он на сайте одного нашего соотечественника, но хостинг у меня буржуйский, и они отказываются мне его поставить.
смена хостинга на данный момент не рассматривается, сервер "упал" один раз за пол года которые я с ними, такого у меня ещё не было.
вопросы,
- можно ли как-то как-нибудь обойти эту проблему, напр. указать парсеру не смотрель на кодировку, или XML::DOM для меня потерян?
- какая есть популярная альтернатива (популярная, потому что надеюсь уже у хостинга будет установлена и не надо будет им опять что-то доказывать) этим модулям, чтобы попроще в обращении?
заранее спасибо!
-
flamey:
Оказалось что у XML::Parser\'а нет файла конфигурации для работы с кодировкой CP1251, и каждый скрипт он тормозит с ошибкой что нет такого файла. С CP1250 всё работает. Нужного файла нет на CPAN\'е, есть он на сайте одного нашего соотечественника, но хостинг у меня буржуйский, и они отказываются мне его поставить.
че-то ты намешал по моему... причем тут XML::Parser и \'нет такого файла\' и кодировка? Ты пытаешься файлы называть по русски что ли а потом сувать их в парсер?
-
Пример:
# __TEST.XML_________________________________
036
AUD
1
Австралийский доллар
16,0102
# __TEST.PL_________________________________
#!/usr/bin/perl
use warnings;
use XML::Parser;
my $CBRfile = "test.xml";
my $CBRparser = new XML::Parser();
my $CBRlist = $CBRparser->parsefile($CBRfile);
до того как я добавил windows-1251.enc (который я нашёл в инете) в C:\\Perl\\site\\lib\\XML\\Parser\\Encodings, результат вышеприведённого примера был:
Couldn\'t open encmap windows-1251.enc:
No such file or directory
at C:/Perl/site/lib/XML/Parser.pm line 187
а всё из-за этого:
"Expat has built-in encodings for: UTF-8, ISO-8859-1, UTF-16, and US-ASCII. ... For encodings other than the built-ins, expat calls the function load_encoding in the Expat package with the encoding name. This function looks for a file in the path list @XML::Parser::Expat::Encoding_Path, that matches the lower-cased name with a \'.enc\' extension. The first one it finds, it loads." (из док-ции XML::Parser)
как только добавил я этот файл всё заработало.
хостинг провайдер отказывается добавить этот файл.
вообще-то я щас буду пробовать одну идею, но всё равно интересно есть ли альтернатива которая не является wrapper\'ом XML::Parser-а.
-
понятно. Как варианты:
1. перегнать xml в utf-8
use Text::Iconv;
$converter = Text::Iconv->new("windows-1251", "utf-8");
$xml_in_utf = $converter->convert("содержимое твоего xml");
только надо будет в заголовке xml сменить encoding="windows-1251" на encoding="utf-8"
2. вырезать все русские символы. И тогда можно тоже смело сменить encoding="windows-1251"
-
спасибо за советы!
в др. форуме тоже посоветовали поменять кодировку. я так и сделал, всё работает. я не знал что XML::DOM может работать со строками, везде примеры только с URL\'ами. наверно надо начинать с документации, а не с примеров :)
а Text::Iconv на сервере тоже не стоит :(