• Publicidad

No me reconoce las palabras con tildes

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

No me reconoce las palabras con tildes

Notapor jorgel » 2010-06-07 21:13 @926

Hola, tengo un problema con un buscador que estoy haciendo.

El problema es que cuando se le pasa una palabra con tilde no funciona; sin embargo con palabras normales sí trabaja bien. Necesito ayuda urgente. Aquí les dejo el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub buscador
{
        my $word = $_[0];
        my @palabras = split (/ /, $word);
        my $dbh=C4::Context->dbh;
        my $sth;
        my $consulta="SELECT pregunta, respuesta, usuario, fecha, hora, asunto FROM preguntas WHERE respuesta !=''";

        $sth=$dbh->prepare($consulta);

        $sth->execute();

        my @arr = ();
        while (my $val = $sth->fetchrow_hashref())
        {
                foreach (@palabras)
                {

                next if($_ !~ /\w+|í|á|é|ó|ú/ );
               
        if($val->{pregunta} =~ /$_/i or $val->{respuesta} =~ /$_/i or $val->{asunto} =~ /$_/i)  

                        {      

                                       
        push @arr, {"pregunta" => $val->{pregunta}, "respuesta" => $val->{respuesta}, "usuario"=> $val->{usuario}, "fecha"=> $val->{fecha}, "horaa"=>$val->{hora}, "asunto"=>$val->{asunto}};

                                last;

                                }

                }              

        }

        return @arr;

}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
jorgel
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2010-06-07 20:56 @913

Publicidad

Re: No me reconoce las palabras con tildes

Notapor danimera » 2010-06-07 23:00 @000

Deberías poner el error que te genera, o a qué te refieres cuando dices que no funciona... :?
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: no me reconoce las palabras con tildes

Notapor jorgel » 2010-06-08 00:20 @056

Cuando se entra una palabra normal, o sea, una palabra sin ñ o sin tildes, busca normalmente en la base de datos las palabras que se entraron por parámetros; pero cuando se entra una ñ por ejemplo uña, no busca en la base de datos y al hacerle un print() para ver qué se está entrando me muestra esto uña, y me imagino que al comparar uña con uña no lo encuentre y por eso no busque nada. Realmente no sé cómo arreglarlo.
jorgel
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2010-06-07 20:56 @913

Re: No me reconoce las palabras con tildes

Notapor jorgel » 2010-06-08 00:47 @074

Ya lo solucioné con utf8::decode($valor);
Gracias de todas formas...
jorgel
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2010-06-07 20:56 @913

Re: No me reconoce las palabras con tildes

Notapor explorer » 2010-06-08 06:21 @306

Bienvenido a los foros de Perl en Español, jorgel.

Se trata de un problema de codificación. Por defecto, Perl siempre trabaja con iso-8859-1 tanto en la entrada como en la salida. Si no es esa la codificación, pues entonces habrá problemas con los caracteres especiales.

Yo, por ejemplo, trabajo con sistemas que usan utf8, tanto en la entrada como en la salida. Como en el entorno donde estoy tengo definida la variable del sistema $LANG = es_ES.UTF-8, me basta con poner en los programas Perl una línea como la siguiente:

use open 'locale';

Y Perl busca en el entorno qué codificación debe usar tanto para la entrada como para la salida. De esa manera, puedo leer ficheros y entradas en utf8, y las salidas, irán con esa misma codificación.

Más información en perldoc perluniintro.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No me reconoce las palabras con tildes

Notapor panterozo » 2010-06-09 12:15 @552

Yo también tenía problemas con la codificación, y mi solución fue la misma que ocupó "jorgel". Pero esto es una especie de solución parche que utilicé alguna vez.

explorer escribiste:Yo, por ejemplo, trabajo con sistemas que usan utf8, tanto en la entrada como en la salida. Como en el entorno donde estoy tengo definida la variable del sistema $LANG = es_ES.UTF-8, me basta con poner en los programas Perl una línea como la siguiente:

use open 'locale';

Y Perl busca en el entorno qué codificación debe usar tanto para la entrada como para la salida. De esa manera, puedo leer ficheros y entradas en utf8, y las salidas, irán con esa misma codificación.

Más información en perldoc perluniintro.


¿A qué te refieres que usas sistemas con utf8 en la entrada y salida...?
Me leí la documentación, pero poco logré entender :s...

¿Es posible que te pongas un ejemplo? ¿Para aceptar acentos, ñ y caracteres como Ç sin necesidad de poner decode()?

;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: No me reconoce las palabras con tildes

Notapor explorer » 2010-06-09 14:08 @630

panterozo escribiste:¿A qué te refieres que usas sistemas con utf8 en la entrada y salida...?
Me leí la documentación, pero poco logré entender :s...

¿Es posible que te pongas un ejemplo? ¿Para aceptar acentos, ñ y caracteres como Ç sin necesidad de poner decode()?


Quiero decir que yo uso sistemas informáticos con codificación utf8.

Así, como Perl piensa que, por defecto, todo está en iso-8859-1, debo indicarle que no, que lo que va a leer por la entrada estándar está en utf8. Y que deseo, además, que la salida también sea así.

Hay varias formas de indicar esto.

La primera, usando la función binmode(), en la que podemos indicar la capa de traducción del controlador de ficheros: binmode(STDIN, ":encoding(utf8)"); o binmode(STDOUT, ":utf8");. Naturalmente, hay que hacerlo justo antes de empezar a leer o escribir al fichero.

(Más información en perldoc -f binmode)

Otra forma es declarándolo con el pragma open, al principio del programa:
use open IN => "iso-8859-15", OUT => "utf-8";

(Más información en perldoc open)


Con ejemplos: supongamos que estamos en un sistema Linux funcionando con codificación utf8. La salida del siguiente programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3.  
  4. say "Camión";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
es, justamente,
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@dv9210:~/Documentos/Desarrollo> ./kk.pl;./kk.pl|hexdump -C
Camión
00000000  43 61 6d 69 c3 b3 6e 0a                           |Cami..n.|
00000008
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Vemos que sale bien... pero en realidad, no... Lo que ocurre es que hemos escrito Camión, de forma literal, dentro del programa. Pero Perl no ve eso, sino Camión. Es decir, una ristra de caracteres codificados en iso-8859-1. Cuando le pedimos que lo saque por pantalla, pues la salida también estará en esa codificación, por lo que la salida es la misma: Camión, pero como estamos trabajando en una terminal utf8, nos transforma ese flujo en Camión.

Lo correcto, sería indicar a Perl que el programa sí está escrito en utf8:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use utf8;
  4.  
  5. say "Camión";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero... la salida es extraña:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@dv9210:~/Documentos/Desarrollo> ./kk.pl;./kk.pl|hexdump -C
Cami�n
00000000  43 61 6d 69 f3 6e 0a                              |Cami.n.|
00000007
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Ahora resulta que el programa Perl ha "entendido" que el carácter ó escrito en el programa, es realmente un carácter más (no dos bytes), así que lo transforma a un "carácter gordo". Hasta ahí, bien. El problema es la salida... sigue siendo en iso-8859-1. Perl transforma la cadena de caracteres a esa codificación, y entonces el "carácter gordo" ó (dos bytes) es transformado en el carácter simple ó (un byte). Y eso es lo que nos muestra (el byte 0xF3).

Hay que cambiar la codificación de la salida, para indicar que la queremos en utf-8:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use utf8;
  4.  
  5. binmode STDOUT, ':utf8';
  6.  
  7. say "Camión";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y ahora ya sale bien:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@dv9210:~/Documentos/Desarrollo> ./kk.pl;./kk.pl|hexdump -C
Camión
00000000  43 61 6d 69 c3 b3 6e 0a                           |Cami..n.|
00000008
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Otra forma de indicarlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use utf8;
  4.  
  5. use open OUT => ':utf8';    # la salida será en utf8
  6. use open ':std';            # y en los controladores estándares: STDIN, STDOUT, STDERR
  7.  
  8. say "Camión";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Finalmente, si nuestro sistema ya tiene el entorno configurado con utf8 (por ejemplo, la variable de entorno $LANG lo tengo puesto a es_ES.UTF-8), entonces vale con indicar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use utf8;
  4.  
  5. use open ':locale';     # que es lo mismo que decir: use open IO => ':locale';
  6.  
  7. say "Camión";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por eso, al trabajar con Perl (o con cualquier otro lenguaje), hay que prestar atención
* en qué codificación, por defecto va a trabajar el programa. En Perl, sabemos que es iso-8859-1
* cuál es la codificación de lo que leemos
* en qué codificación deben ser las salidas.

En otros hilos de estos foros ya hemos comentado sobre esto:
* Nombres de ficheros con caracteres latinos en Windows
* Problemas al convertir UCS-2
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No me reconoce las palabras con tildes

Notapor panterozo » 2010-06-10 08:51 @411

Muy completa y clara tu explicación, explorer... Muchas gracias.

¡¡¡¡ A probarlo !!!!
:P
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: No me reconoce las palabras con tildes

Notapor melinda_mv » 2011-09-27 04:16 @219

Hola explorer. Yo tengo un problema parecido aunque el dato que recupero es de una tabla. Yo quiero dejar los acentos o tildes. He copiado tu código de
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use utf8;
  3. #binmode STDOUT, ':utf8';
  4. use open OUT => ':utf8';
  5. print "Camión";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y el error que me sale es tanto con binmode() como con el use open:

Malformed UTF-8 character (unexpected non-continuation byte 0x6e, immediately after start byte 0xf3)

No sé si me falta instalar alguna librería. Tengo abierta una consulta sobre este tema.
Ahora mismo con mi proceso no me da ningún error pero en la salida me sustituye la tilde por un '?', es decir, en vez de camión a mi saldría cami?n.
melinda_mv
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-09-27 03:49 @201

Re: No me reconoce las palabras con tildes

Notapor explorer » 2011-09-27 05:28 @270

El error dice que ha encontrado un carácter 0xf3 (la 'ó'), y que, como la salida está codificada en utf-8 (línea 4), para sacar el carácter correcto, ha mirado qué carácter sigue, y se ha encontrado con que es un 0x6e (la 'n'), que, juntos, no corresponden a ningún carácter válido en utf-8. Y de ahí, sale el error: no ha podido crear un carácter utf-8 válido, con esa combinación de caracteres.

El problema es el siguiente: en el programa, has declarado que está escrito en utf-8 (línea 2), pero tu no lo has hecho así: "Camión" (y el resto del programa) está en otra codificación de caracteres, distinta de la utf-8.

Has utilizado un editor de textos (para escribir el programa) con una codificación de caracteres distinta de la utf-8. Y en el programa dices que sí, que sí que está en utf-8. Perl intenta sacar caracteres utf-8, pero se encuentra con uno erróneo, y te avisa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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