«Не удается расшифровать строку с широкими символами» появляется в странном месте - PullRequest
5 голосов
/ 11 июля 2009

Я пытаюсь использовать модуль Perl XML :: RAI для текста в кодировке UTF8, и у меня все еще есть ошибка, которую я не совсем понимаю ... вот код (он пока не должен делать ничего полезного):

use HTTP::Request;
use LWP::UserAgent;
use XML::RAI;
use Encode;

my $ua = LWP::UserAgent->new;


sub readFromWeb{
    my $address = shift;
    my $request = HTTP::Request->new( GET => $address );
    my $response = $ua->request( $request );
    return unless $response->code == 200;

    return decode("utf8", $response->content());
}

sub readFromRSS{
    my $address=shift;
    my $content = readFromWeb $address;
    my $rai = XML::RAI->parse_string($content);
          #this line "causes" the error
}


readFromRSS("http://aktualne.centrum.cz/export/rss-hp.phtml");
     #I am testing it on this particular RSS

ошибка:

 Cannot decode string with wide characters at /usr/lib/perl5/5.8.8/i686-linux/Encode.pm line 166.

Понятия не имею, виновата ли это моя вина или ошибка XML :: RAI. Я не вижу, где могут быть эти широкие символы, если $ content уже декодирован из utf8 ...

edit: по какой-то причине я до сих пор не понимаю, удаление части "decode" фактически решило проблему.

1 Ответ

9 голосов
/ 11 июля 2009

Проблема в двойном декодировании. XML::RAI::parse_string() по-видимому ожидает документ в кодировке UTF-8 и выполняет само декодирование. если ты передать строку, которая уже декодирована, повторное декодирование не удастся, конечно:

#!/usr/bin/perl
use strict;
use warnings;

use Encode qw( decode );
use LWP::Simple qw( get );

my $xml = get("http://aktualne.centrum.cz/export/rss-hp.phtml");

$xml = decode('UTF-8', $xml);
$xml = decode('UTF-8', $xml); # dies: Cannot decode string with wide characters ...

Так что просто пропустите шаг decode(), и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...