• Publicidad

use UTF8, utf8 NO BOM y librerías

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

Re: use UTF8, utf8 NO BOM y librerías

Notapor explorer » 2013-08-05 12:23 @557

O sea, que funciona:

Has leído una sola línea de $Pagina, y esa es la línea que te muestra el navegador.

Fíjate que yo uso locale() dentro de unas llaves, para leer todo el archivo -todas las líneas- con una sola lectura (modo aspiradora).

Entonces: o pones mi solución (locale redefiniendo la variable $/), o haces un bucle por todas las líneas del archivo de entrada.
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

Publicidad

Re: use UTF8, utf8 NO BOM y librerías

Notapor lr_emilio » 2013-08-06 11:42 @529

Correcto, explorer, ya me funciona.

El código final es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub LeHtmUTF8 {
  2.  
  3.     $Pagina = $_[0];
  4.     $P      = @_;
  5.  
  6.     $PosBarraV = index( $Pagina, "|" );
  7.     if ( $PosBarraV ne "-1" ) {
  8.         $Pagina = substr( $Pagina, 0, $PosBarraV );
  9.     }
  10.     open( SUST, '<:encoding(UTF-8)', $Pagina ) or die;
  11.     @lin_pag = <SUST>;
  12.     close SUST;
  13.     $contenido = join( "", @lin_pag );
  14.     for ( $c = 1; $c < $P; $c++ ) {    #>
  15.         $U = "S$c";
  16.         $V = $_[$c];
  17.         $contenido =~ s/§$U§/$V/g;
  18.     }
  19.     binmode( STDOUT, ':encoding(UTF-8)' );
  20.     print <<LIM;                       #>
  21. content-type: text/html;charset=UTF-8 \n\n
  22. $contenido
  23. LIM
  24.     1;
  25. }
  26.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


El único cambio que he notado es que en la llamada del open() he suprimido las comillas de "$Pagina".

Un millón de gracias.
lr_emilio
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2013-08-01 11:57 @539

Re: use UTF8, utf8 NO BOM y librerías

Notapor explorer » 2013-08-06 12:15 @552

Esta es mi versión (no probada):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use autodie;
  2. use open IO => ':utf8';          # codificación por defecto en las entradas y salidas
  3. use open ':std';                 # también en las entradas y salidas estándar
  4.  
  5. sub LeHtmUTF8 {
  6.     my $Pagina = shift;
  7.     $Pagina =~ s/\|.*//;         # quitamos desde la primera barra vertical, hasta el final
  8.  
  9.     my $contenido = '';
  10.     open my $SUST, '<', $Pagina;
  11.     {
  12.         local $/;
  13.         $contenido = <$SUST>;
  14.     }
  15.     close $SUST;
  16.  
  17.     for(my $c = 0; $c < @_; $c++) {
  18.         $contenido =~ s/§S$c§/$_[$c]/g;
  19.     }
  20.  
  21.     print "Content-Type: text/html;charset=UTF-8\n\n$contenido";
  22. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
De todas maneras... creo que ese charset, ahí, sobra.
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: use UTF8, utf8 NO BOM y librerías

Notapor lr_emilio » 2013-08-07 11:42 @529

Hola, muchas gracias por tus respuestas.

La parte de esa función con los .html, está funcionando, pero ahora tengo otro problema al juntarlo con la base de datos.

Cuando recojo datos de la base que está en utf8_general_ci y lo muestro con la función LeHtmUTF8("archivo.html","$DatoDelaBase")
me muestra estos caracteres: Facturación.

En la base se ven bien los datos con sus acentos correctamente.

Es decir, si el carácter raro está dentro del .pl donde llamo a LeHtmUTF8 se muestra bien por pantalla.
En cambio, si recojo ese carácter desde una base y lo imprimo desde el .pl con LeHtmUTF8 es cuando me imprime mal.

Este es el código que utilizo para la consulta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dbh = DBI->connect( "dbi:$Driv:$Base", $User, $Pass, { mysql_enable_utf8 => 1 } )
  2.     || die &MensajesErrores( "", "No se pudo Conectar a $Base", "", "" );
  3. $dbh->do("SET NAMES 'utf8'");
  4. my $sth1 = $dbh->prepare("SELECT $campos FROM $tabla where ($comparar);");
  5. $sth1->execute();
  6. while ( @Lv = $sth1->fetchrow_array() ) { push( @LiReEn1, @Lv ); }
  7. $sth1->finish();
  8. $dbh->disconnect || warn &LeHtm( "Mensajes/mensaje.htm", "", "No se pudo desconectar", "", "" );
  9. if   ( $resultado != 0 ) { $mens1 = "No se ha podido encontrar"; }
  10. else                     { $mens1 = ""; }
  11. }
  12.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Algo se me está escapando?

Edito: si añado esto en el .pl, antes de llamar al leHtm, me lo imprime bien, ¿¿es necesario??
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $UsuarioNom= decode('utf8',$UsuarioNom);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Un saludo y muchas gracias.
lr_emilio
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2013-08-01 11:57 @539

Re: use UTF8, utf8 NO BOM y librerías

Notapor explorer » 2013-08-07 14:47 @657

Resumen: Perl, por defecto, no sabe qué es lo que está leyendo.

Te cuento lo que pasa. Cuando lees 'Facturación' desde una base de datos, ésta te devuelve esta ristra de bytes:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. 46 61 63 74 75 72 61 63 69 c3 b3 6e Facturación 
Nosotros, como sabemos que la base de datos está codificada en utf8, vemos claramente que el carácter tildado 'ó' está codificado en dos bytes (0xc3, 0xb3).

Pero Perl no lo sabe... Perl cree que esos son datos en codificación iso-8859-1 (latin 1), así que los guarda en la variable $UsuarioNom, como una simple ristra de bytes.

Luego, cuando le mandas imprimir el valor, recuerda que le pusimos que queremos que lo haga en codificación utf8. Como la variable $UsuarioNom es una ristra de bytes (no caracteres Unicode), Perl entonces hace transformación de código: de latin 1 a utf8, así que lo que emite es:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. 46 61 63 74 75 72 61 63 69 c3 83 c2 b3 6e Facturación 
¿Por qué? Pues porque Perl tiene que transformar el byte 0xc3 -que él supone que es un carácter en latin 1- a un carácter en utf8, por lo que lo transforma en (0xc3, 0x83). Y el byte 0xb3 lo transforma en (0xc2, 0xb3).

Y el resultado final es que en pantalla vemos "caracteres raros", como lo llamas tú.

En cambio, cuando haces el decode(), le estás diciendo a Perl que lo que contiene la variable está en utf8, así que lo guarda de otra manera -una ristra de caracteres en Unicode-, y cuando más tarde lo mandas imprimir, hace la codificación de otra manera, y sale de la forma correcta.
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: use UTF8, utf8 NO BOM y librerías

Notapor explorer » 2013-08-10 20:28 @894

Actualización: me he dado cuenta de que tienes activada la opción

mysql_enable_utf8 => 1

que solo es válida a partir de DBD::mysql v4.004 o mayor.

Entonces, la propia base de datos es la que hace la decodificación de los datos de la base de datos, de utf8, a caracteres internos en Perl, por lo que, solo es necesario hacer un cambio de codificación en el momento de sacar los datos hacia el exterior.

Artículo donde lo explica mejor (en inglés).

Entonces... no entiendo por qué te está fallando y necesitas hacer el decode(). Hay algo que se nos está escapando.
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: use UTF8, utf8 NO BOM y librerías

Notapor lr_emilio » 2013-08-13 09:28 @436

Hola,

Ante todo gracias y perdón por el retraso en contestar.

Estuve montando un servidor CentOS 6.4 con Perl v5.18 y con MySQL actualizado por si pudiera ser de eso.

En cuanto lo tenga todo configurado y con los datos (espero que hoy termine) pruebo de nuevo.

Publicaré en breve. Muchas gracias.
lr_emilio
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2013-08-01 11:57 @539

Re: use UTF8, utf8 NO BOM y librerías

Notapor lr_emilio » 2013-08-23 03:34 @190

Buenos días,

Tengo ya montado el servidor pero tengo algunos problemas:

El log me muestra esto y no encuentro información de este error.
Sintáxis: [ Descargar ] [ Ocultar ]
  1.  
  2. [Fri Aug 23 12:29:52 2013] [error] [client 192.168.1.175] Unknown "re" subpragma '/aa' (known ones are: 'debug', 'debugcolor', 'eval', 'taint') at /usr/local/lib/perl5/utf8_heavy.pl line 4, referer: http://********/index1.htm 
  3. [Fri Aug 23 12:29:52 2013] [error] [client 192.168.1.175] Bareword found where operator expected at /usr/local/lib/perl5/utf8_heavy.pl line 23, near "s/[-\\s_]//rg", referer: http://*****/index1.htm 
  4. [Fri Aug 23 12:29:52 2013] [error] [client 192.168.1.175] syntax error at /usr/local/lib/perl5/utf8_heavy.pl line 23, near "s/[-\\s_]//rg", referer: http://*****/index1.htm 
  5. [Fri Aug 23 12:29:52 2013] [error] [client 192.168.1.175] BEGIN not safe after errors--compilation aborted at /usr/local/lib/perl5/utf8_heavy.pl line 149., referer: http://****/index1.htm 
  6. [Fri Aug 23 12:29:52 2013] [error] [client 192.168.1.175] Compilation failed in require at /usr/share/perl5/utf8.pm line 17., referer: http://****/index1.htm 
  7. [Fri Aug 23 12:29:52 2013] [error] [client 192.168.1.175] Compilation failed in require at /home/****/public_html/cgi-bin/Bitacora_Acceso.pl line 12., referer: http://****/index1.htm 
  8. [Fri Aug 23 12:29:52 2013] [error] [client 192.168.1.175] Premature end of script headers: Bitacora_Acceso.pl, referer: http://****.es/index1.htm 
  9.  
lr_emilio
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2013-08-01 11:57 @539

Re: use UTF8, utf8 NO BOM y librerías

Notapor explorer » 2013-08-23 05:52 @286

El utf8_heavy.pl creo que es el programa que se carga cuando ponemos en el nuestro 'use utf8;'.

He estado mirando varios utf8_heavy.pl, de Perl distintos, y creo que la línea que muestras existe solo a partir de Perl v5.18.

Compara la cuarta línea de estos dos archivos:

http://cpansearch.perl.org/src/RJBS/per ... 8_heavy.pl
http://cpansearch.perl.org/src/RJBS/per ... 8_heavy.pl

Así que... tienes un Perl muy moderno :)

Ejecuta perl -v para saber qué versión tienes.

El uso de 'use re "/aa";' es relativamente moderno, pero a mi me funciona en mi Perl v5.14.2 y v5.16.2:

perl -E 'use re "/aa"; say "Ok"'
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: use UTF8, utf8 NO BOM y librerías

Notapor lr_emilio » 2013-08-26 09:20 @431

Hola,

¿La versión 5.10 que trae CentOS 6.4 por defecto es una versión muy antigua?

Lo digo porque no sé qué versión es la más recomendable para instalar... La v5.18 se ve que no porque me dan error todas las páginas.

Muchas gracias.
lr_emilio
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2013-08-01 11:57 @539

AnteriorSiguiente

Volver a Web

¿Quién está conectado?

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