2009-07-11 6 views
5

Estoy tratando de usar el módulo XML :: RAI perl en texto codificado en UTF8 y todavía tengo un error que realmente no entiendo ... aquí está el código (no debe hacer nada útil aún):"No se puede decodificar cadena con caracteres anchos" aparece en un lugar extraño

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 

el error es:

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

que no tienen ni idea de si eso es mi culpa o por culpa de XML :: RAI. No veo dónde pueden estar estos caracteres anchos, si $ contenido ya está decodificado desde utf8 ...

editar: por alguna razón todavía no entiendo, eliminar la parte de "decodificación" en realidad resolvió el problema.

Respuesta

9

El problema es la decodificación doble. XML::RAI::parse_string() aparentemente espera un documento codificado en UTF-8 y realiza la descodificación. Si pasa en una cadena que ya está decodificado, decodificar una segunda vez se producirá un error, por supuesto :

#!/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 ... 

Así que saltarse el paso decode() y se le multa.

Cuestiones relacionadas