Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Problemas con utf8

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Lun May 05, 2008 1:33 pm
Láquesis
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Oct 2006
Mensajes: 6
Problemas con utf8 Responder citando

Hola.

Al tratar de leer en GNU/Linux un fichero creado en Windows y guardarlo con codificación utf8, sale el siguiente mensaje:

Código:
Wide character in print at script.pl line 5
  hola


Mi código:

Perl:
use open IO => ":utf8";
open(my $H1, "file.txt");
$text = <$H1>;
close($H1);
print "$text";


y lo que tengo en el fichero a leer es: hola.

Lo que realmente necesito es leer ficheros en uft8 que pueden venir tanto de Windows como de Linux. Para este último todo perfecto.

Espero alguien me pueda ayudar. Muchas gracias.
Mensaje Lun May 05, 2008 2:20 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
Responder citando

Creo que es por el eol.
Con
Código:
hexdump -C file.txt

Mira que no tenga "\r\n" como eol.
Mensaje Lun May 05, 2008 3:34 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
Responder citando

Desconozco, en ese texto, dónde está el carácter 'gordo' en formato utf8, pero supongamos que está.

El tema es que te falta un detalle. Verás: usas el pragma 'open' para indicar que los ficheros abiertos a partir de ahora, en lectura y escritura, deben hacerlo con el layer 'utf8' para considerar que queremos que los ficheros vayan en esa codificación.

Pero... se nos olvidó que el STDOUT ya estaba abierto... cuando haces el print, lo haces hace el STDOUT. Por defecto, Perl usa siempre la codificación Latin1 (o iso-8859-1). Lo que hay que hacer es indicar que queremos la salida también en esa codificación.

En tu código, se puede hacer de dos maneras básicas (hay más):

1. Agregando use open ':std'; detrás del use open .... Esto hace que los manipuladores de ficheros estándar (STDIN, STDOUT y STDERR) se incluyen en la codificación que indicas en el pragma open anterior.

Perl:
use open IO => ":utf8";
use open ':std';
open my $H1, q{<}, 'file.txt';
$text = <$H1>;
close $H1;
print $text;


2. Poner un binmode(STDOUT, ':utf8'); antes del print. Eso hace el cambio de codificación del manipulador de salida.

Perl:
use open IO => ":utf8";
binmode STDOUT, ':utf8';
open my $H1, q{<}, 'file.txt';
$text = <$H1>;
close $H1;
print $text;


Más información en la página del pragma open.

Ultima edición por explorer el Lun Sep 01, 2008 4:08 pm, editado 2 veces
Mensaje Lun May 05, 2008 3:52 pm
Láquesis
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Oct 2006
Mensajes: 6
Responder citando

Hola:

Gracias por responder ...

Lo que muestra es:

00000000 ef bb bf 68 6f 6c 61 |...hola|
00000007
Mensaje Lun May 05, 2008 4:27 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
Responder citando

Los 3 bytes que preceden al 'hola' es la marca especial (Byte-order mark) que indica que el fichero está en formato utf8, algo que suelen hacer algunos programas de Windows.

Código:
explorer@casa:/home/explorer/Documents/Desarrollo> hexdump -C hola.txt
00000000  ef bb bf 48 6f 6c 61                              |...Hola|
00000007
explorer@casa:/home/explorer/Documents/Desarrollo> file hola.txt
hola.txt: Unicode text, UTF-8
Mensaje Mie May 07, 2008 3:35 am
Láquesis
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Oct 2006
Mensajes: 6
Responder citando

Hola:

Lo que necesito en realidad es trabajar solo con el texto en utf8. Así que con el módulo UTF8BOM pude eliminar el Byte-order mark.

Muchas gracias por la ayuda.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group