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});

