Alguna vez hemos tenido que recurrir a Perl, como medio para extraer algún contenido de archivos de texto o bien utilizar alguna de sus librerías (por ejemplo: HTML::Template) como alternativa a PHP.
En inglés no suele existir problema alguno con el idioma, pero si empleamos el español, nos encontraremos que los resultados no son los deseados, los acentos, eñes y diéresis se pierden.
Esto se soluciona de una forma sencilla, fijando las variables de entorno de idioma al principio del script de Perl:
$ENV{LC_ALL} = “es_ES”;
$ENV{LC_MESSAGES} = “es”;
$ENV{LC_CTYPE} = “es_ES.ISO-8859-1”;
$ENV{LANG} = “es_ES”;
Esto es válido cuando usamos HTML::Template, pero utilizando XML::Parse ó XML::XSLT, la solución anterior no funciona. En este sentido parece existir un bug y para solucionar este problema de una forma poco limpia, pero efectiva, se puede utilizar la siguiente función que reemplaza algunos de los caracteres especiales (acentos, diéresis e incluso el símbolo del euro) por el correspondiente Latin ISO-8859-1:
sub toSpanish { my $s = $_[0]; my %equiv = (161 => 'á', 169 => 'é', 173 => 'í', 179 => 'ó', 186 => 'ú', 129 => 'Á', 137 => 'É', 141 => 'Í', 147 => 'Ó', 154 => 'Ú', 177 => 'ñ', 145 => 'Ñ', 164=> 'ä', 171=> 'ë', 175=> 'ï', 182=> 'ö', 188=> 'ü', 132=> 'Ä', 139=> 'Ë', 143=> 'Ï', 150=> 'Ö', 156=> 'Ü', 160=> 'à', 168=> 'è', 172=> 'ì', 178=> 'ò', 185=> 'ù', 162=> 'â', 170=> 'ê', 174=> 'î', 180=> 'ô', 187=> 'û', 130=> 'Â', 138=> 'Ê', 142=> 'Î', 148=> 'Ô', 155=> 'Û', 128=> '?', 191=> '¿', 161=> '¡' ); while (my ($key, $value) = each %equiv) { my $char = chr(195) . chr($key); $s =~ s/$char/$value/cg; } return $s; }
Su uso es simple. Sólo hay que capturar la respuesta del parseador. Por ejemplo y suponiendo que uno de los atributos de un elemento llamado ‘page’ del archivo XML $infile, se llama ‘description’ y description contuviera ‘Stensiö y García’, sería:
my $parser = new XML::Parser(Style=>'Tree'); my $tree = $parser->parsefile($infile); my $description = toSpanish($pages->[0]->{description});