Perl – convertir ISO-8859-1 a UTF-8

perl-pdfPerl usa como codificación de caracteres a UTF-8 de forma predeterminada, sin embargo es común que perl tenga que interactuar con otros juegos de caracteres provenientes de fuentes de datos externos como archivos de texto, csv o bases de datos donde los caracteres sean representados típicamente en ISO-8859-1 también conocido como Latin1 si provienen de sistemas windows,colocándonos así en la tarea de tener que convertir ó transformar la codificación de los caracteres con los que estemos trabajando para así cumplir nuestros objetivos de programación.

El principal problema o dolor de cabeza de datos codificados en Latin1 presentes en entornos utf8 es la representación de caracteres especiales como (ñ y Ñ) y las letras acentuadas (con acentos) como [á,é,í,ó,ú,Á,É,Í,Ó,Ú,à,é,Á,É] que son mostrados con algo similar a: �.

El siguiente perl script usa el módulo Encode para transformar caracteres ISO-8859-1 provenientes de una base de datos MySQL a UTF-8, que para los efectos de esta entrada serán imprimidos por pantalla tanto la data original como la convertida en UTF-8.

[sourcecode language=”perl”]
#!/usr/bin/perl -w
use DBI;
use Encode;

$bd = DBI->connect("DBI:mysql:basededatos:host","usuario", "clave", { PrintError => 1}) || die $DBI::errstr;

$sth=$bd->prepare(‘SELECT * FROM noticias order by id asc limit 2000’);
$sth->execute();

while(@consulta =$sth->fetchrow_array()){
print "id: ".++$incremeta_id;
print " Titulo original: ".$consulta[1]." – ";
print "Convertido UTF-8: ".encode(‘utf-8’, $consulta[1])."\n";
}

print "\t\t\n $incremeta_id registros convertidos a UTF-8\n";

$sth->finish;
[/sourcecode]

La función encode que vemos en la linea 13 recibe dos (2) parámetros. El primero el juego de caracteres que necesitamos y el segundo la cadena de texto (string) a realizar la conversión.

$utf8-string = encode("utf8", $string);
lenin@i5:~/Escritorio/convert$ time perl test-encode.pl
id: 1990 Titulo original: Se entreg� este a�o mil becas de Maestr�a y Doctorado – Convertido UTF-8: Se entregó este año mil becas de Maestría y Doctorado
id: 1991 Titulo original: Vecinos: “Grabaci�n aclara m�s la masacre” – Convertido UTF-8: Vecinos: “Grabación aclara más la masacre”
id: 1992 Titulo original: El inc�modo muerto – Convertido UTF-8: El incómodo muerto
id: 1993 Titulo original: Explosi�n de artefacto dej� tres heridos – Convertido UTF-8: Explosión de artefacto dejó tres heridos
id: 1994 Titulo original: Crudo repunt� a 26,60 d�lares por barril – Convertido UTF-8: Crudo repuntó a 26,60 dólares por barril
id: 1995 Titulo original: Peri�dico presentar� �Memoria – Convertido UTF-8: Periódico presentará “Memoria
id: 1996 Titulo original: Derechos del ni�o – Convertido UTF-8: Internet: Derechos del niño
id: 1997 Titulo original: Recolecci�n de basura – Convertido UTF-8: Recolección de basura
id: 1998 Titulo original: “No m�s cuentos” – Convertido UTF-8: “No  más cuentos”
id: 1999 Titulo original: GALER�A DE IM�GENES – Convertido UTF-8: GALERÍA DE IMÁGENES
id: 2000 Titulo original: Alcald�a entreg� donativo – Convertido UTF-8: Alcaldía entregó donativo
2000 registros convertidos a UTF-8
real 0m0.666s
user 0m0.052s
sys 0m0.020s
lenin@i5:~/Escritorio/convert$

Como resultado tenemos ya los caracteres legibles por pantalla, preparados para ser procesados, representados en otros medios ó almacenados en correcto UTF-8. El ejemplo fue realizado en Debian GNU-Linux.

2 comentarios en “Perl – convertir ISO-8859-1 a UTF-8

  1. Tengo un problema estoy migrando de isis a marc 21 y no que conversión hacer.Ya probé esta y nada.La cuestión es que en la base esta lam(con tilde en la a) y cuando tomo el valor me pone á,así con los demás caracteres especiales.Por favor si sabes como resolver esto ayudame.Gracias de antemano.

  2. Tengo un problema estoy migrando de isis a marc 21 y no que conversión hacer.Ya probé esta y nada.La cuestión es que en la base esta lam(con tilde en la a) y cuando tomo el valor me pone á,así con los demás caracteres especiales.Por favor si sabes como resolver esto ayudame.Gracias de antemano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *