Skip to content
Home » Selección de idioma en Perl

Selección de idioma en Perl

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