El módulo recomendado para hacer transformaciones de códigos, es el
Encode.
En uno de los últimos trabajos que hice, todos los argumentos recibidos eran sin caracteres tildados, así que por esa parte no tenía problemas. Pero sí a la salida, cosa que solucioné poniendo esta línea antes del final:
Using perl Syntax Highlighting
utf8::encode( $salida_html ) if utf8::is_utf8($salida_html); # encode for UTF-8
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Aquí, estoy preguntando si la variable $salida_html contiene caracteres unicode (algo que puede suceder si en las operaciones anteriores se incorporaron caracteres o plantillas así codificadas. En ese caso, llamo a utf8::encode para que convierta esos caracteres unicode a codificación utf8, ya que quiero que toda la salida sea en utf8.
Naturalmente, antes, le he dicho a CGI que debe aparecer esa codificación:
Using perl Syntax Highlighting
$query->charset('UTF-8'); # salida siempre en utf8
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esta línea creará una salida
Content-Type: text/html; charset=UTF-8en la cabecera HTTP de respuesta hacia el navegador web. Y además, en $salida_html, hay en la cabecera así:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />No sería necesaria, pero bueno, por si acaso.
En cuanto a tu problema, te pongo la recomendación que da el propio módulo CGI:
-utf8
Hace que CGI.pm trate a todos los parámetros como cadenas UTF-8. Úselo con cuidado, ya que interferirá
con el procesado de las subidas binarias. Es mucho mejor seleccionar manualmente qué campos se espera
que devuelvan cadenas utf-8, y convertirlas usando un código como este:
use Encode;
my $arg = decode utf8=>param('foo');
Después de esa línea, $arg contendrá una cadena con caracteres Unicode, el formato interno que usa Perl, así que ya podrás realizar el resto de operaciones de cadena con ella.