• Publicidad

Problema con tildes y eñes

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

Notapor explorer » 2007-09-16 21:20 @930

Hasta que no hagas un volcado hexadecimal no lo podremos saber... puedes hacerlo con hexdump u od.
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

Publicidad

Notapor robenavente » 2007-09-19 11:02 @501

Aquí van mis resultados del volcado hexadecimal, según yo está todo en orden:
Para el archivo generado con echo:
Código: Seleccionar todo
cat kk.txt|./hdump.pl
000000: C3 B1

Para el archivo genrado con vi:
Código: Seleccionar todo
cat kk2.txt|./hdump.pl
000000: C3 B1 0A
robenavente
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-09-11 21:42 @946

Notapor explorer » 2007-09-19 11:38 @526

Los dos muestran que son ficheros utf8, salvo que uno tiene un avance de línea. Es posible que una de las opciones del vi sea tener siempre un avance de línea como último carácter de un fichero.

Bien. Esto quiere decir que la terminal (mejor dicho, la shell) está trabajando en utf8 y que el vi también está grabando ficheros en ese formato.

Bueno, pues entonces:
* si vas a incluir caracteres 'extraños' en tu código Perl, debes poner 'use utf8;'
* si dentro del código vas a hacer comparaciones entre cadenas o usar expresiones regulares o alguna cosa relativa a la codificación, pones 'use locale;' (Más info en locale)

Si falla, quizás haya que repasar el estado interno del flag utf8 y empezar a pensar en usar Encode.
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

Notapor Perl user » 2007-09-19 12:39 @569

Hola,

Aparte de los documentos que te recomienda explorer de verificar, es recomendable RECORDAR el uso del pragma bytes, que hace que ciertas funciones (como print, substr, etc...) utilicen un patrón "multi-byte" para su trabajo. En una terminal que soporte utf8, la siguiente línea debe funcionar:

perl -Mutf8 -Mbytes -e 'print "ñ"'

Recuerda que, la representación de los caracteres en codificaciones multi-byte tiene que ver mucho con diferentes aspectos: con dispositivos, con E/S, con el cómo Perl trata a las funciones, etc.

Definitivamente es un tema interesante, sin embargo, en Perl es una tarea poco trivial, ya que requiere de la comprensión de dicha codificación y de como el lenguaje la representa para cada uno de los fines posibles.

Saludos,
Última edición por Perl user el 2007-09-19 12:53 @578, editado 1 vez en total
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor robenavente » 2007-09-19 12:42 @571

Efectivamente me sigue fallando. Abrí un nuevo archivo en vi, para asegurarme y puse:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
$frase= "Un niño aniñado";
print "$frase \n";
$frase =~ tr/ña/añ/ ;
print "$frase \n";
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Cuya salida es:
Código: Seleccionar todo
Un niño aniñado
Un nia� �niañdo


El mismo código, pero con "use utf8" da:
Código: Seleccionar todo
Un ni� ani�do
Un niao �ia�o


Y agregando "use locale" :
Código: Seleccionar todo
Un ni� ani�do
Un niao �ia�o


No entiendo bien por que al usar utf8 ni siquiera me muestra bien la cadena sin traducir.
robenavente
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-09-11 21:42 @946

Notapor explorer » 2007-09-19 20:24 @892

Te salen mal porque en realidad te está mostrando caracteres en iso-8859-1 (latin1).

Después de leer el comienzo de perlunicode, he probado el siguiente programa y sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use encoding 'utf8';

$frase= "Un niño aniñado";
print "$frase \n";
$frase =~ tr/ña/añ/ ;
print "$frase \n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Desde luego, todo este tema es bastante complicado. Según el manual, "use encoding 'utf8'" es lo mismo que 'use utf8', pero se ve que no.

El problema es que Perl distingue entre operaciones de bytes, de caracteres y octetos. Según la operación que sea, trabajará en un modo u otro.
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

Notapor explorer » 2007-09-20 03:54 @204

En el módulo utf8 hay un par de funciones para pasar entre varios modos de utf8.
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

Notapor robenavente » 2007-09-20 20:53 @912

Hola Perl User, no había visto tu mensaje. Justamente perl -Mutf8 -Mbytes -e 'print "ñ"' me devuelve una ñ sin mayor inconveniente. En general el problema se presentaba al querer operar sobre ella (split, traducción, if ($algo eq "ñ", etc. ).

Explorer, justamente el programa que dices me funcionó correctamente. Yo también tenía entendido (no se bien donde lo leí) que use utf8 y use encoding 'utf8' eran completamente equivalentes. De hecho creo haber probado (cuando recién comencé a tratar de resolver el asunto) con use encoding 'latin1' , obviamente no funcionó. Bueno ¡muchas gracias! por su paciencia ;). Trataré de buscar cual es la diferencia entre ambas sentencias.
robenavente
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-09-11 21:42 @946

Anterior

Volver a Básico

¿Quién está conectado?

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