• Publicidad

perl encoding

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

perl encoding

Notapor seafree » 2012-08-28 10:20 @472

Buenos días, al utilizar:

use utf8;
print $q->header('text/html; charset=UTF-8');

En algún momento se visualizaron los caracteres especiales pero actualmente no es así. Me pueden ayudar, por favor, a determinar la causa. Gracias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Publicidad

Re: perl encoding

Notapor explorer » 2012-08-28 10:43 @488

El 'use utf8;' solo sirve para indicar que el propio programa está escrito en utf-8. No influye en la salida de caracteres en utf-8.

La siguiente línea, si suponemos que pertenece a un objeto CGI, lo único que hace es sacar una cabecera HTTP indicando que lo que sigue estará en esa codificación, pero tampoco influye en la salida de caracteres en utf-8.

Es posible que haya ocurrido un cambio de versión de Perl...

Como primera solución (no la he probado), si tienes una versión de CGI moderna, prueba a enviar la cabecera de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print $q->header(
  2.     -type    => 'text/html',
  3.     -charset => 'utf-8',
  4. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Estaremos enviado la mismas cabeceras, pero además, se estará llamando a la función charset() de CGI, que indica qué codificación queremos en la salida.

¡Ah!, intenta usar una versión de Perl lo más moderna posible.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: perl encoding

Notapor seafree » 2012-09-03 11:12 @508

Hola, utilicé lo que mencionas pero NO obtengo el resultado esperado. La versión de Perl que utilizo es v5.8.8

¿Tendrás una propuesta más?

Gracias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: perl encoding

Notapor explorer » 2012-09-03 11:21 @514

Falta algo muy importante: hay que codificar la salida en utf8.

Como la salida la solemos hacer hacia la salida estándar, basta con hacer un

binmode STDOUT, ":utf8";

al principio del programa, antes de la salida del código HTML.

Resumen (en inglés)

P.D. la v5.8.8 es de hace casi 7 años...

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ corelist -r |fgrep 5.8.8
v5.8.8      2006-01-31
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: perl encoding

Notapor seafree » 2012-09-03 11:37 @526

Utilicé lo que dices y tampoco funciona.

Lo raro es que anteriormente sí mostraba los acentos y actualmente no.

Te envío la configuración actual que tengo para mostrar el script de consulta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use utf8;
  2. print $q->header('text/html; charset=UTF-8');
  3. print start_html('SALUDOS');
  4. print "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />";
  5. print "<BODY BGCOLOR='#FFFFFF' TOPMARGIN='0' LEFTMARGIN='0'>";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El código anterior lo sustituyo por lo que dices y no obtengo el resultado esperado. ¿Debo de actualizar perl o corregir las líneas anteriores?
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: perl encoding

Notapor explorer » 2012-09-03 12:33 @564

A ver... usando sólo CGI, a mi me funciona bien, incluso desde la línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ perl -MCGI=:standard -e 'use utf8; binmode STDOUT, ":utf8"; print header(-charset=>"utf-8"),start_html(-title => "SALUDOS", -bgcolor => "#FFFFFF", -topmargin => 0, -leftmargin => 0),p("áéíóúñÑ"),end_html, "\n"'
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>SALUDOS</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body leftmargin="0" bgcolor="#FFFFFF" topmargin="0">
<p>áéíóúñÑ</p>
</body>
</html>
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Mi terminal está en utf8, así que veo los caracteres perfectamente.
Lo he probado con v5.10.1 y v5.16.1. v5.8.8 debería estar completamente adaptado a Unicode.

Pero lo curioso es que dices que ha sido el cambio de repente. ¿No será que lo que ha cambiado es el servidor web?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: perl encoding

Notapor seafree » 2012-09-03 13:46 @615

Gracias por continuar, con tu código, creo un archivo html y visualizo bien los caracteres pero necesito adecuarlo a que sea un cgi.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: perl encoding

Notapor explorer » 2012-09-04 06:51 @327

La línea de comandos que te he escrito ya es un CGI. Incluso usa el mismo módulo que tú, el CGI.pm.

Lo que no sabemos es por qué el tuyo no genera los caracteres.

La clave está en el binmode(), que hace que la salida vaya codificada en utf8.

¿Por qué no pruebas a construir un CGI mínimo, lo ejecutas en el servidor, y nos dices qué pasa?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # CGI MÍNIMO. Versión utf8
  3. # Joaquín Ferrero. 2012.
  4. # Este cgi sirve para comprobar si el servidor funciona con Perl+CGI, en modo utf8
  5. #
  6. use utf8;
  7. use CGI       qw(:standard      );
  8. use CGI::Carp qw(fatalsToBrowser);
  9.  
  10. binmode STDOUT, ":utf8";
  11.  
  12. print
  13.     header(-charset=>"utf-8"),
  14.     start_html('CGI MÍNIMO'),
  15.     h1('CGI MÍNIMO'),
  16.     hr,
  17.     p('Si ves este texto es que sí está funcionando bien.'),
  18.     hr;
  19.  
  20. # Aquí sacamos la lista de los parámetros
  21. # en caso de que le haya sido pasado alguno
  22. my @parametros = param();
  23. foreach my $par ( @parametros ) {
  24.         print p($par);
  25.         print blockquote(param( $par ));
  26. }
  27.  
  28. print end_html;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En caso de que suceda algún error, saldrá en la pantalla del navegador, gracias al módulo CGI::Carp.

Importante: este código debe escribirse en un editor con codificación utf8.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: perl encoding

Notapor seafree » 2012-09-04 09:27 @435

Hola, explorer, gracias.

Generé el script con el código que me enviaste y lo veo correctamente pero al insertarlo en mi programa no obtengo el resultado esperado.

Mi código es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use utf8;
  3. use CGI       qw(:standard      );
  4. use CGI::Carp qw(fatalsToBrowser);
  5. use DBI;
  6.  
  7. binmode STDOUT, ":utf8";
  8.  
  9. print
  10.     header( -charset => "utf-8" ),
  11.     start_html('CGI MÍNIMO')
  12.     ;
  13.  
  14. ...;
  15.  
  16. print "<BODY BGCOLOR='#FFFFFF' TOPMARGIN='0' LEFTMARGIN='0'>";
  17. $dbh = DBI->connect( "DBI:Pg:....");
  18. $sql = " ... ";
  19. $sth = $dbh->prepare($sql);
  20. $sth->execute();
  21.  
  22. $registro = $sth->rows;
  23.  
  24. if ($registros > 0) {
  25.     print " < FORM NAME = 'forma' METHOD = 'post' ACTION = '///*.cgi' > ";
  26.     print " < table width = '100%' cellspacing = '0' cellpadding = '0' border = '1' > ";
  27.  
  28.     while (my $ref_eventos = $sth->fetchrow_hashref()) { ###LECTURA registros de $sql
  29.         ...;
  30.         ...;
  31.         $causa = $ref_eventos->{'causa'}; ##descripción con caracteres especiales
  32.         print " < td width = '20%' align = 'center' > <font face='arial' size='2'>$causa < /font></ td > ";
  33.      } ###->while
  34.  
  35.      print  " < /table>";
  36. }
  37. else {
  38.     ...;
  39. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Cuál es mi error? Gracias.
Última edición por explorer el 2012-09-04 10:32 @480, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: perl encoding

Notapor explorer » 2012-09-04 10:32 @481

El problema está en la línea 31, que no sabemos en qué están codificados los datos que lees de la base de datos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Intermedio

¿Quién está conectado?

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

cron