Lun May 05, 2008 1:33 pm
|
 |
Láquesis
Perlero Nuevo

|
Registrado: 12 Oct 2006
Mensajes: 6
|
|
| Problemas con utf8 |
|
|
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. |
|
|
|
Lun May 05, 2008 2:20 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
|
|
|
|
|
Creo que es por el eol.
Con
| Código: |
| hexdump -C file.txt |
Mira que no tenga "\r\n" como eol. |
|

Lun May 05, 2008 3:34 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
|
|
|
|
|
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.
2. Poner un binmode(STDOUT, ':utf8'); antes del print. Eso hace el cambio de codificación del manipulador de salida.
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 |
|

Lun May 05, 2008 3:52 pm
|
 |
Láquesis
Perlero Nuevo

|
Registrado: 12 Oct 2006
Mensajes: 6
|
|
|
|
|
Hola:
Gracias por responder ...
Lo que muestra es:
00000000 ef bb bf 68 6f 6c 61 |...hola|
00000007 |
|
Lun May 05, 2008 4:27 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
|
|
|
|
|
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 |
|
|
Mie May 07, 2008 3:35 am
|
 |
Láquesis
Perlero Nuevo

|
Registrado: 12 Oct 2006
Mensajes: 6
|
|
|
|
|
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. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|