Perl 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: �.
Convertir a UTF8
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.
#!/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;
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);
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.
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.