Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > xml+cp1251


Автор: popkorn 22.10.2006, 12:09
беру xml здесь: http://www.cbr.ru/scripts/XML_daily.asp?date_req=
он в cp1251


Код

#!/usr/bin/perl

use XML::Simple;
$xml = XMLin('1.xml');
print $xml->{Valute}->[0]->{Name}


в ответ получаю строку в unicode, как получить в cp1251 ?


Автор: nitr 22.10.2006, 17:58
perldoc Encode

Код

...
use Encode qw(decode encode);
...
print encode('cp1251', decode('utf8', $xml->{Valute}->[0]->{Name}));
...


Добавлено @ 18:00 
как пример ;)

Автор: popkorn 22.10.2006, 21:32
nitr
а средствами XML::Simple нельзя перекодировать ?

даже не перекодировать, а что бы XML::Simple не изменял исходную кодировку документа smile


Автор: nitr 22.10.2006, 22:52
а почему решил, что выдаёт в юникоде?

Автор: popkorn 24.10.2006, 00:36
Цитата


а почему решил, что выдаёт в юникоде?



эм ну потому что запустил в консоли и получил на экран текст в юникоде smile
#perl 1.pl
абракатабра

#perl 1.pl > 1.txt && iconv -f utf8 -t cp1251 1.txt 
#cat 1.txt
нормальный текст 



smile

Автор: nitr 24.10.2006, 09:24
popkorn, ОСь? smile
я под виндой проверял smile файлик в cp1251 smile
Код

if($self->{opt}->{outputfile}) {
    if(ref($self->{opt}->{outputfile})) {
      my $fh = $self->{opt}->{outputfile};
      if(UNIVERSAL::isa($fh, 'GLOB') and !UNIVERSAL::can($fh, 'print')) {
        eval { require IO::Handle; };
        croak $@ if $@;
      }
      return($fh->print($xml));
    }
    else {
      local(*OUT);
      open(OUT, '>', "$self->{opt}->{outputfile}") ||
        croak "open($self->{opt}->{outputfile}): $!";
      binmode(OUT, ':utf8') if($] >= 5.008);
      print OUT $xml || croak "print: $!";
      close(OUT);
    }
  }

из этого кода многое понятно ;) , но так как ты хочешь...
используй XML::Parser, сложней, зато верней ;)

читаем тут smile
Код

Note: the current implementation of this option generates a string of XML
and uses a SAX parser to translate it into SAX events.  The normal encoding
rules apply here - your data must be UTF8 encoded unless you specify an 
alternative encoding via the 'XMLDecl' option; and by the time the data reaches
the handler object, it will be in UTF8 form regardless of the encoding you
supply.  A future implementation of this option may generate the events 
directly.

Автор: djkostya 24.10.2006, 10:15
use Text::Iconv;
my $converter = Text::Iconv->new("utf8","cp1251");
my $result = $converter->convert("$text");


print "$result";

В скаляре $result будет текст в windows-1251

Автор: nitr 24.10.2006, 12:12
djkostya, я уже приводил решение ;)
http://forum.vingrad.ru/index.php?showtopic=117614&view=findpost&p=897108
но ему как-то по-другому хочется smile)
Цитата(popkorn @  22.10.2006,  21:32 Найти цитируемый пост)
nitr
а средствами XML::Simple нельзя перекодировать ?даже не перекодировать, а что бы XML::Simple не изменял исходную кодировку документа smile
Это сообщение отредактировал popkorn - 22.10.2006,  21:51


Автор: djkostya 24.10.2006, 19:34
Ну он же Iconv использовал для примера я ему и пример с Iconv написал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)