Lo primero: te recomiendo que leas el libro de
chromatic,
Modern Perl (enlace al libro al final de ese mensaje). Sobre todo el par de páginas relativas a la explicación de cómo funciona Perl con las codificaciones internas de caracteres.
Otro enlace que hay que revisar es el wikibook
Perl Programming/Unicode UTF-8. Ahí está
todo explicado, aunque sea un auténtico ladrillo (el resumen está en el libro de
chromatic).
El flujo de trabajo para trabajar con utf8 está indicado en la sección
UTF-8 Flow, pero el más general es:
- decodificar la entrada al programa, desde la codificación en la que viene, a la interna de Perl
- procesar el texto como queramos
- a la hora de la salida, codificar desde la representación interna de Perl a la que deseemos entregar a la salida
Vamos, lo mismo que te
respondí hace tiempo.
En cuanto a tu programa...
- use utf8; indica que el propio programa contiene caracteres en utf8. NO realiza labores de transliteración.
- para "adivinar" la codificación de un fichero (del que no sabemos nada), se puede usar algún módulo, como por ejemplo Encode::Guess (aunque este solo detectará codificaciones ascii, utf8 y UTF-16 o UTF-32 que tengan la marca BOM).
- una vez que sabes qué codificación es, la puedes pasar al formato interno de Perl, o hacer que todas las operaciones de cadena sean en utf8, que es el otro formato interno en que Perl puede trabajar.
- para grabarlo en disco, en utf8, debes indicarlo así en la capa (layer) del open(), para que haga la transformación, según lo que vayas a escribir esté en formato interno o utf8.
- para la salida en web, es lo mismo que la salida en disco, debes decidir la codificación de la página que vas a enviar, y actualizar la marca <meta> de forma apropiada. Por ejemplo:
Using html4strict Syntax Highlighting
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
- para la salida en pantalla, es lo mismo que la salida en disco, solo que la pantalla tiene su propia codificación. Debes averiguar en qué codificación está trabajando esa terminal.
Al principio, cuesta.
Yo mismo, muchas veces, cuando estoy haciendo un programa que, por ejemplo, va a leer una hoja de cálculo Excel, ya me estoy acordando de la familia que inventó esto, porque resulta que cada celda puede estar en una codificación distinta, así que te ves obligado a mirar los atributos de formateo de cada celda, pasarlo todo a una codificación estándar (con la ayuda de Encode), procesarlo, y mandarlo a la web con otra codificación de salida (normalmente, utf8).
Al final, todo se reduce a lo comentado: decodificar, procesar, codificar.
Perl v5.14 trae más mejoras para gestionar utf8. Incluso trae un nuevo
pragma llamado
unicode_strings, con el que podremos indicar que todas las operaciones las queremos realizar en modo Unicode (y no como si fueran una ristra de bytes).