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
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
say "Camión";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
es, justamente,
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:
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use utf8;
say "Camión";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
pero... la salida es extraña:
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:
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use utf8;
binmode STDOUT, ':utf8';
say "Camión";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y ahora ya sale bien:
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:
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use utf8;
use open OUT => ':utf8'; # la salida será en utf8
use open ':std'; # y en los controladores estándares: STDIN, STDOUT, STDERR
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
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use utf8;
use open ':locale'; # que es lo mismo que decir: use open IO => ':locale';
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