Oct 172014
 
Artículo Perl

Normalmente, un script perl lee y escribe de distintas fuentes los datos que procesa: ficheros, bases de datos, teclado, literales en el código fuente…

Los datos de texto leídos de estas fuentes pueden estar codificados utilizando distintos tipos de codificación, siendo utf8 y latin1 (ISO 8859-1) los más comunes. Para garantizar que estos datos son procesados adecuadamente, es necesario especificar explícitamente el tipo de codificación que utilizan, como se explica en este artículo.

1. Uso de literales de texto en el código fuente

El código fuente de un script puede contener sentencias en donde se asignan valores literales a las variables. Por ejemplo, podemos escribir en un script  “prueba.pl” una sentencia de asignación:

Pero el propio fichero “prueba.pl” que contiene estas sentencias puede estar codificado en utf8, en latin1, o en algún otro tipo de codificación.

Para evitar problemas de codificación, podemos convertir el fichero a formato utf8 (con un editor de texto que lo permita, o con la utilidad ‘iconv’ disponible en casi todas las distribuciones linux,…) y utilizar la sentencia “use utf8” al comienzo del script para indicar al intérprete de perl que los literales de texto contenidos en el script se encuentran codificados en utf8:

Pero aún así, podemos encontrarnos con que el resultado que imprime este script puede ser distinto cuando se ejecuta en distintas máquinas. Esto se debe a que el comando print envía los datos a STDOUT, y el intérprete de perl puede no haber identificado correctamente el tipo de codificación que utiliza el terminal desde el que se está ejecutando. En el siguiente punto se explica cómo solucionar este problema.

2. Operaciones de Entrada/Salida a terminal: STDIN, STDOUT, STDERR

Perl utiliza el manejador de fichero STDIN para leer datos del teclado, y los manejadores de fichero STDOUT y STDERR para escribir en la pantalla del terminal en el que se ejecuta un script.

Pero el terminal utiliza una determinada codificación de caracteres, y el intérprete de perl no siempre la identifica correctamente, por lo que conviene especificar explícitamente el tipo de codificación de caracteres del terminal. Para ello, añadimos a nuestro script de ejemplo las correspondientes llamadas a “binmode”:

3. Operaciones de entrada/salida a ficheros

Al igual que en el caso de la entrada/salida al terminal, tras realizar la llamada a “open” para abrir el fichero a leer o escribir, se puede utilizar “binmode” para especificar explícitamente el tipo de codificación del mismo:

Alternativamente, podemos especificar el tipo de codificación del fichero en la llamadda a “open”:

4. Leer y escribir datos de una base de datos

La lectura y escritura de datos sobre una base de datos desde un script perl depende básicamente de la librería de acceso a datos que se utilice, y de la propia base de datos.

La regla general es establecer de manera explícita el tipo de codificación que se debe emplear en cada caso.

Ejemplo 1:

  • Conexión a una base de datos MySQL utilizando DBI, a partir de la versión 4,004 de DBD::mysql

En primer lugar, tras establecer la conexión a la base de datos, nos aseguramos de que está en modo utf8:

A continuación, realizamos las operaciones de lectura y escritura deseadas:

Ejemplo 2:

  • Conexión a una base de datos MySQL utilizando DBI, en versiones de DBD::mysql anteriores a la 4.004

En este caso, debemos establecer explícitamente la conversión a realizar con el comando $dbh->do().

Adicionalmente, hay que utilizar decode_utf8() para activar el flag utf8 de los textos recuperados de la base de datos:

Ejemplo 3:

  • Tabla que utiliza la codificación de caracteres latin1, pero contiene valores codificados en utf8

Este caso es bastante habitual. Por ejemplo, podemos tener una tabla definida de la siguiente forma:

En ella, hemos insertado dos registros. Si examinamos el contenido de la tabla desde el propio cliente mysql:

Como vemos, el primer registro está codificado en latin1, pero el segundo está codificado en utf8, y el resultado que se presenta en pantalla es incorrecto, porque no se realiza la conversión de la secuencia utf8 “ó” al carácter “ó”.

Pero si leemos el contenido de la tabla utilizando el código perl del Ejemplo 1, en el que se utiliza el flag mysql_enable_utf8, el resultado es:

Como vemos, con el flag mysql_enable_utf8, DBI detecta la presencia de secuencias UTF8 en los datos leidos, y realiza automáticamente la conversión necesaria.

Referencias

 Publicado por en 9:56 am

 Deja un comentario

(requerido)

(requerido)