
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 ;
use ;
$bd = ->connect("DBI:mysql:basededatos:host","usuario", "clave", { => 1}) || die $DBI:: ;
$sth = $bd-> ('SELECT * FROM noticias order by id asc limit 2000');
$sth-> ();
while(@consulta =$sth-> ()){
print "id: ".++$incremeta_id;
print " Titulo original: ".$consulta[1]." - ";
print "Convertido UTF-8: ". ('utf-8', $consulta[1])."\n";
}
print "\t\t\n $incremeta_id registros convertidos a UTF-8\n";
$sth-> ;
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.