• Publicidad

CGI::Application::Plugin::TT y UTF-8

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

CGI::Application::Plugin::TT y UTF-8

Notapor fjmn2001 » 2012-04-23 15:58 @707

Saludos, comunidad de Perl en Espanol.

Les escribo en este caso solicitando ayuda para la realización de una aplicación web.

Se me ha presentado un problema con respecto a la codificación de la página web. Quiero que ésta use UTF-8 debido a que todos mis datos los manejaré bajo esa codificación. He agregado la etiqueta meta en el html para tal fin, he modificado Apache2 para que defina utf-8 por defecto pero no consigo que la página web se codifique en utf-8.

Anexo el código para su mejor entendimiento. De ante mano, muchas gracias.

Contenedor - esta es mi plantilla de ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <html>
  2. <head>
  3. <title>Tierra Activa - Principal</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. </head>
  6. <body>
  7. [%nombre%]
  8. </body>
  9. </html>
  10.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


applicacion.pm
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use CGI::Application::Plugin::TT;
  2.  
  3. sub setup {
  4.         my $self = shift;
  5.        
  6.         $self->tt_config(TEMPLATE_OPTIONS => {INCLUDE_PATH => '/var/www/tierra_activa/template',POST_CHOMP   => 1});
  7. }
  8.  
  9. # FUNCIÓN PARA PROCESAR LAS PLANTILLAS
  10. sub processtmpl {
  11.         my ($self,$tmplname,$params) = @_;
  12.         my $query = $self->query();
  13.         return $self->tt_process($tmplname, \%$params);
  14. }
  15. sub index {
  16.         my $self = shift;
  17.         my $vars;
  18.         my $file = "contenedor";
  19.        
  20. # $$vars{"nombre"} puede venir de la base de datos pero para este ejemplo lo coloque así.
  21. #Lo que quiero expresar con esto es que la codificación tanto de entrada como de salida debe ser utf-8.
  22.  
  23.         $$vars{"nombre"} = "Francisco José";
  24.        
  25.        
  26.         return $self->processtmpl($file,$vars);
  27. }
  28.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
fjmn2001
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2009-06-25 15:11 @674

Publicidad

Re: CGI::Application::Plugin::TT y UTF-8

Notapor explorer » 2012-04-23 16:45 @739

No importa lo que le digas a Apache2 sobre la codificación por defecto: según el valor del meta de la página, así saldrá la cabecera HTTP con el charset adecuado.

Puedes probar a hacer un telnet servidor 80 para comprobar qué cabecera te está devolviendo.

Y otro tema distinto es el propio contenido de la página.

Una cosa es lo que indiquemos en la cabecera, pero luego, en nuestro programa, nosotros somos responsables de que los datos emitidos también estén en esa codificación.

Del código mostrado no vemos ninguna pista que nos diga en qué están codificados los datos.

Si pones $$vars{"nombre"} = "Francisco José"; de forma literal en el programa, ¿pusiste un pragma 'use utf8;' al principio para indicar que estabas escribiendo literales en utf8 dentro del propio programa?

Si los datos salen de una base de datos, ¿en qué codificación salen? Perl, por defecto, piensa que todo está en iso-8859-1.

Siempre, siempre, siempre, hay que saber en qué codificación leemos y en qué vamos a escribir.

Podemos realizar las transformaciones con el módulo Encode o con capas E/S en los open().

Vemos que usas el entorno de programación CGI::Application. Cuando lo usaba, tenía que hacer esto:
* en el cgiapp_init() definía el charset:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub cgiapp_init() {  
  2.     my $self = shift;
  3.    
  4.     $query = $self->query;                      # creamos un objeto CGI
  5.     $query->charset('UTF-8');                   # salida siempre en utf8
  6.     ...
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* Y justo antes de terminar, convertía todo a utf8:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub cgiapp_postrun {
  2.     my ($self, $output_ref) = @_;
  3. #    my @parametros = $self->param;
  4. #    $$output_ref .= $query->pre($self->dump . join("\n", map { "$_ => " . $self->param($_) } @parametros) . "\n" . $self->query->param);
  5. #    $$output_ref .= $query->pre(Dumper($xls));
  6. #    $$output_ref .= $query->pre($query->user_agent());
  7.  
  8.     utf8::encode( $$output_ref ) if utf8::is_utf8($$output_ref); # encode for UTF-8
  9.  
  10.     $session->flush if $self->session_loaded;                   # ¿cuál de los dos es necesario? ¿Este o el de teardown?
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Las funciones utf8::encode() y utf8::is_utf8() son internas de Perl. En esa línea nos preguntamos si $$output_ref (la página definitiva) está en utf8. Realmente quiere decir si está codificado en Unicode. Si ese es el caso, convertimos la secuencia Unicode en secuencia de bytes ya en utf8. Y eso es lo que sale hacia afuera.

Más información en http://cgi-app.org/index.cgi?BestPractices en el enlace sobre utf8.

P.D. Sí, es algo complicado.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: CGI::Application::Plugin::TT y UTF-8

Notapor fjmn2001 » 2012-04-23 21:42 @945

¡¡¡Muchas gracias!!! Modificando el código de la siguiente manera lo he logrado.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub cgiapp_init {
  2.         my $self = shift;
  3.         my $query = $self->query;
  4.         $query->charset("UTF-8");
  5.         $self->dbh_config("DBI:Pg:host=localhost;dbname=aaa", 'bbb', 'ccc', {pg_enable_utf8 => 1});
  6. }
  7.  
  8. sub cgiapp_postrun {
  9.         my ($self, $output_ref) = @_;
  10.  
  11.         utf8::encode( $$output_ref ) if utf8::is_utf8($$output_ref);
  12.         $self->session->flush if $self->session_loaded;              
  13. }
  14.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
fjmn2001
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2009-06-25 15:11 @674


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 16 invitados