• Publicidad

Problemas con utf8

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

Problemas con utf8

Notapor Láquesis » 2008-05-05 14:33 @648

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: Seleccionar todo
Wide character in print at script.pl line 5
  hola


Mi código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use open IO => ":utf8";
open(my $H1, "file.txt");
$text = <$H1>;
close($H1);
print "$text";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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.
Láquesis
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2006-10-12 19:17 @845

Publicidad

Notapor creating021 » 2008-05-05 15:20 @681

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

Mira que no tenga "\r\n" como eol.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2008-05-05 16:34 @731

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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use open IO => ":utf8";
use open ':std';
open my $H1, q{<}, 'file.txt';
$text = <$H1>;
close $H1;
print $text;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use open IO => ":utf8";
binmode STDOUT, ':utf8';
open my $H1, q{<}, 'file.txt';
$text = <$H1>;
close $H1;
print $text;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en la página del pragma open.
Última edición por explorer el 2008-09-01 17:08 @755, editado 2 veces en total
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 Láquesis » 2008-05-05 16:52 @744

Hola:

Gracias por responder ...

Lo que muestra es:

00000000 ef bb bf 68 6f 6c 61 |...hola|
00000007
Láquesis
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2006-10-12 19:17 @845

Notapor explorer » 2008-05-05 17:27 @769

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: Seleccionar todo
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
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 Láquesis » 2008-05-07 04:35 @232

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.
Láquesis
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2006-10-12 19:17 @845


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados

cron