• Publicidad

Codificación cgi

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Codificación cgi

Notapor JavierMolina » 2011-05-01 12:10 @549

Hola amigos, este foro me es muy útil en mis andanzas con Perl, aunque no me había registrado hasta ahora, que tengo un problemilla que no puedo solucionar :oops:

La cosa es que tengo problemas con la codificación en un cgi. Desde un formulario, se debe mandar una dirección web al script y éste debe generar un resultado y mostrarlo en formato web, obviamente. El caso es que los caracteres no salen correctamente. He probado a especificar en la cabecera del html la codificación, y también la he especificado en el script pero sigue sin funcionar:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <html>
  2.     <head>
  3.         <title>Nube de etiquetas</title>
  4.     </head>
  5.     <body>
  6.         <form action="http://localhost/cgi-bin/prueba.pl" method="POST">
  7.             <h3>Web para nube de etiquetas :&nbsp;<h3>
  8.             <p> <input type="text" name="url" size=30> </p>
  9.             <input type="submit" value="Enviar" name="B1">
  10.         </form>
  11.     </body>
  12. </html>
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use utf8;
  4. binmode( STDOUT, ":utf8" );
  5.  
  6. print "Content-type:text/html\n\n";
  7. print
  8.     "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />";
  9.  
  10. read( STDIN, $line, $ENV{'CONTENT_LENGTH'} );
  11. @values = split( /&/, $line );
  12.  
  13. print "<html><head><title>Parsing with POST method</title></head>";
  14. print "<body>\n";
  15. print "<h2>These were the values sent</h2>\n";
  16.  
  17. foreach $i (@values) {
  18.  
  19.     ( $varname, $data ) = split( /=/, $i );
  20.     if ( $varname ne "B1" ) {
  21.         print "The variable is $varname, the value is $data<p>";
  22.     }
  23. }
  24.  
  25. print "</body></html>\n";
  26.  
Coloreado en 0.011 segundos, usando GeSHi 1.0.8.4


El resultado es así:

The variable is url, the value is http://www.elpais.com%2Frss%2Ffeed.html ... Id%3D17041

Espero que podáis ayudarme...

Un saludo.
JavierMolina
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-05-01 12:04 @544

Publicidad

Re: Codificación cgi

Notapor explorer » 2011-05-01 19:38 @860

Bienvenido a los foros de Perl en español, JavierMolina.

Yo veo varios problemas...

  • Estás enviando una marca <meta> en la que indicas que el resto del código HTML va a ir en codificación iso-8859-1, pero resulta que no es así: en la línea 4 estás indicando que todo lo que salga por STDOUT ha de ir codificado en utf8, así que es normal que los caracteres acentuados salgan mal
  • Los caracteres que muestran la URL están bien codificados. Es así, realmente, como ha sido enviado desde el navegador del usuario a tu programa CGI. Lo que te queda por hacer es descodificarles. Esto lo tienes explicado en el perldoc perlfaq9, en la sección How do I decode or create those %-encodings on the web?, que es usando la función uri_unescape() del módulo URI::Escape, aunque también explica cómo hacerlo de forma directa
  • No estás usando el módulo CGI, que te ayudaría a reducir el código bastante. Por ejemplo, se encargaría de hacer toda la lectura e interpretación de los parámetros pasados por el usuario, de tal manera que en tu programa solo tendrías que poner un my $url = param('url'); para recibir el parámetro del mismo nombre que el formulario está recibiendo. Mira mi CGI mínimo para que veas un ejemplo de lo que se puede hacer.
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: Codificación cgi

Notapor JavierMolina » 2011-05-02 03:32 @189

Muchas gracias explorer.

El primer punto que señalas ya lo sabía. Solamente estaba haciendo un montón de pruebas a ver si funcionaba, pero como siempre a lo loco :lol:. Respecto al segundo punto, también lo había visto y juraría que lo probé sin obtener resultado, ya estaba casi decidido a hacer yo mismo la conversión de la codificación mediante expresiones regulares.

Lo que me ha sorprendido es tu CGI mínimo, no por la minimalidad si no por el hecho de que las direcciones se decodifican correctamente sin incluir nada más, supongo que será por el módulo CGI que no estaba usando.

Un gran aporte, debería estar en algún manual de CGI :D

¡Muchas gracias!
JavierMolina
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-05-01 12:04 @544


Volver a Web

¿Quién está conectado?

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