Bienvenido a los foros de Perl en Español, coppeli.
He cargado tu línea, y la he puesto en un fichero xml, guardando el acento en formato UTF-8.
Luego, he ejecutado tu programa, que ha generado un nuevo fichero XML.
Me sale un error del XMLin() porque lo he creado con una cabecera que dice que lo que sigue está codificado en UTF-8, pero resulta que lo grabaste con codificación ISO-8859-1, la de por defecto que usa Perl, ya que no has indicado ninguna al hacer el open() de escritura. No me sale tu error, porque seguro que será debido a otra causa.
Si cambiamos la línea a
Using perl Syntax Highlighting
$codificacion = q(<?xml version="1.0" encoding="ISO-8859-1"?>);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
entonces no habrá problemas y obtendremos el resultado correcto:
Using text Syntax Highlighting
=======================================================
$VAR1 = {
'campo' => {
'content' => "19/11/2009 - 14:22:45 - Rub\x{e9}n Doblado Lopezdesc",
'nombre' => 'DESCRIPCION_LARGA'
}
};
=======================================================
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
El acento está correctamente escrito en ISO-8859-1.
De todas maneras, lo normal es que al trabajar con XML, siempre trabajemos con UTF-8, ya que es la codificación por defecto de XML.
Utilizando la opción de
pragma open: pues... quitamos el Encode y la línea de la llamada a la función decode(); cambiamos la línea 5 para que sea ISO-8859-15; agregamos la línea del
use open tuya y cambiamos la línea 26 por
Using perl Syntax Highlighting
print OUT $datos;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y el resultado es el mismo.
De todas maneras... repasando la documentación de XML::Simple, recomiendan el uso de la opción OutputFile para indicar en ese momento la codificación de salida, del fichero.
Así, supongamos que el fichero sea solo esa línea de prueba que has puesto. Entonces, con el siguiente programa:
Using perl Syntax Highlighting
#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;
my $xml_ref = XMLin('kk.xml', KeepRoot => 1);
print Dumper $xml_ref;
open my $fh, '>:encoding(iso-8859-15)', 'kk_new.xml';
XMLout( $xml_ref,
XMLDecl => '<?xml version="1.0" encoding="ISO-8859-15"?>',
KeepRoot => 1,
OutputFile => $fh,
);
close $fh;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
La salida sigue siendo la correcta: los acentos son transformados desde UTF-8 a la codificación interna de Perl:
Using text Syntax Highlighting
$VAR1 = {
'campo' => {
'content' => "19/11/2009 - 14:22:45 - Rub\x{e9}n Doblado Lopezdesc",
'nombre' => 'DESCRIPCION_LARGA'
}
};
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y la salida del XML, se hace con codificación ISO-8859-15:
Using text Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> cat kk.xml
<campo nombre="DESCRIPCION_LARGA">19/11/2009 - 14:22:45 - Rubén Doblado Lopezdesc</campo>
explorer@casa:~/Documents/Desarrollo> cat kk_new.xml
<?xml version="1.0" encoding="ISO-8859-15"?>
<campo nombre="DESCRIPCION_LARGA">19/11/2009 - 14:22:45 - Rub�n Doblado Lopezdesc</campo>
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
(mi terminal está en UTF-8).
Fíjate también que no indicamos la codificación de entrada, porque XML::Simple supone que los XML siempre están en UTF-8.
Si... siempre siguiéramos la pauta de trabajar en formato UTF-8, entonces quedaría más simple:
Using perl Syntax Highlighting
#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;
my $xml_ref = XMLin('kk.xml', KeepRoot => 1);
print Dumper $xml_ref;
XMLout( $xml_ref,
XMLDecl => 1,
KeepRoot => 1,
OutputFile => 'kk_new.xml',
);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Internamente sigue trabajando en ISO, porque así funcionarán mejor las operaciones de tratamiento de caracteres, pero a la hora de salida, al indicar un nombre de fichero a OutputFile (en lugar de un manejador de archivo), la salida la hará automáticamente a UTF8.
Todo esto también depende un poco de la versión de Perl que estés usando, claro. Lo normal es trabajar con versiones superiores a v5.8.