Por favor, repasa los ejemplos que ya te he dado. Te faltan cosas.
Viendo el código que muestras:
* el método charset() sirve para hacer un auto-escapado de los textos que salen en las cajas de texto de los formularios. O sea, que no te sirve en este ejemplo tan sencillo.
* luego haces una llamada correcta al método header(). Y de hecho, sale bien en las cabeceras HTTP y HTML
* luego llamas a start_html(), y allí vuelves a llamar a head, que sobra completamente
* luego haces la decodificación de los datos de $hola (
suponiendo que ese texto que vemos está escrito en latin1), pero a mi no me funciona como lo has escrito. Abajo lo pongo de forma correcta
* luego haces un print de un p(). Como el contenido de $hola ya contiene algo en utf8, pues eso es lo que emitimos
Lo siguiente me funciona:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use CGI ":all";
use Encode 'from_to';
my $cgi = CGI->new();
print $cgi->header(
-type => 'text/html',
-charset => 'utf-8',
);
print $cgi->start_html(
-title => 'PRUEBA',
);
my $hola = 'HELLO XÓCHITL'; # este código está escrito en latin1
from_to( $hola, 'latin1', 'utf8' ); # lo pasamos a UTF8
print $cgi->p($hola);
print $cgi->end_html;
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
La salida es:
Using html4strict Syntax Highlighting
Content-Type: text/html; charset=utf-8
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>PRUEBA</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<p>HELLO XÓCHITL</p>
</body>
</html>
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aclaraciones:
* el código
del programa está escrito en latin1, NO en utf8, ya que quieres imitar la llegada de datos desde la base de datos
* la salida se ve bien en mi terminal configurada en UTF-8
Pero... la clave está en por qué aparece un content-type iso-8859-1. Yo no veo ninguna línea donde se vea esa doble salida.
Según el archivo Changes del CGI, esa doble línea podría ser debido a la presencia de CGI::Carp cuando se usa la opción 'FatalsToBrowser', pero yo no lo veo ahora en tu nuevo código.
Me temo que es debido a que usas un CGI muy viejo.
Esta es otra forma de hacerlo:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use CGI ":all";
use Encode 'decode';
use open qw(:utf8 :std);
my $cgi = CGI->new();
print $cgi->header(
-type => 'text/html',
-charset => 'utf-8',
);
print $cgi->start_html(
-title => 'PRUEBA',
);
my $hola = 'HELLO XÓCHITL'; # este código está escrito en latin1
$hola = decode('latin1', $hola); # lo pasamos a Unicode, formato interno de Perl
print $cgi->p($hola); # la capa del 'open' pasa de Unicode interno a utf8
print $cgi->end_html;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
El resultado es el mismo.