Página 1 de 1

Error codificación llamando a un java con user www-data

NotaPublicado: 2012-12-20 09:10 @424
por Vertik
Hola,

El asunto es un poco extenso pero no sabia como llamar al problema.

¡Os explico!

Tengo un script en Perl que ejecuta mediante el comando qx() un programa en Java.
Este programa en stdout la solución.

Bien, pues este script ejecutado por terminal, funciona correctamente (muestra los datos bien).
Ejecutado como www-data en el terminal también funciona bien, pero desde el browser, las letras con tilde las transforma a '??'.

Os pongo parte del código, para que veáis lo simple que es la idea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use CGI;
  4. use warnings;
  5. use strict;
  6. use locale;
  7. use POSIX qw(locale_h strftime);
  8. use locale(LC_CTYPE, "utf8");
  9.  
  10. use open      qw(:std :utf8);    # flujos no declarados, en UTF-8
  11. my $form = new CGI;
  12.  
  13. my $query  = $form->param('query');
  14. my $lang  = $form->param('lang');
  15.  
  16.  
  17. my $instruction="";
  18. $instruction.="java ";
  19. $instruction.="analizador $query $lang";
  20.  
  21. my @solucion=qx ($instruction);
  22. my $j=0;
  23.  
  24. print "Content-type: text/HTML;charset=UTF-8\n\n";
  25. while ($j<@solucion) {
  26.         my $linea=$solucion[$j];
  27.         print "$linea\n";
  28.         $j++;
  29. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Lo raro, es que desde el terminal con mi usuario ejecuto el perl y perfecto en las tildes, 'ñ' y lo que quieras. Desde el terminal con el usuario www-data, idéntico, pero desde la aplicación web no, ¡y ya no sé por qué! En un momento pensaba que era por la variable locale, pero al visualizarlo bien desde los dos usuarios, ya me ha matado.

Si tenéis alguna idea, ¡mil gracias!

Re: Error codificación llamando a un java con user www-data

NotaPublicado: 2012-12-20 12:40 @569
por explorer
Creo que el problema está en que el servidor web tendrá definido un locale POSIX=C en el momento del arranque (míralo en el /etc/init.d/). Pero esto no debería importar, porque desde dentro de nuestro programa podemos cambiar de locale. Lo malo es que creo que no estás haciendo ese cambio...

Reescrito el comienzo...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use CGI;
  5. #use locale;                   # no es necesario porque vamos a usar setlocale() a continuación
  6. use POSIX qw(locale_h strftime);
  7. setlocale(LC_CTYPE, "utf-8");  # atención: es setlocale(), NO use locale()
  8. use open  qw(:std :utf8);      # flujos no declarados, en UTF-8
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y luego, en la línea 24, es mejor que la escribas así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print $form->header(
  2.     -type    => 'text/html',
  3.     -charset => 'utf-8',
  4. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Lo que sigue no está formateado como HTML, así que te aconsejo que uses las facilidades de CGI.pm para hacerlo así.

Más información en perldoc -f locale y perldoc perllocale

Re: Error codificación llamando a un java con user www-data

NotaPublicado: 2012-12-21 04:38 @234
por Vertik
¡Hola, explorer!

¡Genial! ¡Funcionó! Era eso mismo, el posix=C

Gracias

Re: Error codificación llamando a un java con user www-data

NotaPublicado: 2012-12-21 06:10 @299
por explorer
¿No se te habrá ocurrido quitarlo, verdad?