• Publicidad

Problema con codificación de fichero en Windows

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

Problema con codificación de fichero en Windows

Notapor empruebas » 2010-08-18 08:17 @387

Hola, tengo un problema con un fichero que estoy tratando en Windows y no consigo aclararme. He leído e intentado varias cosas que he buscado previamente en los foros pero no me han funcionado.

El fichero en cuestión lo genera la utilidad robocopy. En el mismo se muestran ficheros y directorios que se van a actualizar. El problema aparece con los que en su nombre contienen tildes o caracteres que podemos llamar "no estándares". Si abro el fichero con un editor los caracteres con tildes no se muestran correctamente. Una línea de dicho fichero es:

D:\CPRL SEVILLA\Direccion\DIRECCION\Direcci¢n2010\
(os lo muestro exactamente igual que lo hago yo)

Con mi programa lo leo como si fuera utf8 y si lo muestro por pantalla le indico que lo haga también en esa codificación y lo hace correctamente (la línea anterior aparece en pantalla como Dirección2010). Pero, aunque el print() lo muestra bien si pregunto si existe ese fichero realmente no lo encuentra y si creo un directorio lo hace con el carácter que veo en el fichero con el editor.

El programa es el siguiente, para que se vea más claro:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use utf8;
  2.  
  3. binmode STDOUT, ":utf8";
  4.  
  5. open (ENTRADA,"<entrada2.txt");
  6. binmode ENTRADA, 'utf8';
  7.  
  8. @fichero = <ENTRADA>;
  9.  
  10. foreach $dato (@fichero)
  11. {
  12.    chop $dato;
  13.  
  14.    if (-e $dato)
  15.    {
  16.         print "Existe: $dato\n\n";
  17.    }
  18.    else
  19.    {
  20.         print " NO EXISTE: $dato\n\n";
  21.         mkdir $dato;
  22.    }
  23.  
  24. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


A ver si alguien me puede ayudar. Gracias.
empruebas
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2010-08-17 05:23 @266

Publicidad

Re: Problema con codificación de fichero en Windows

Notapor explorer » 2010-08-18 08:53 @412

Bienvenido a los foros de Perl en Español, empruebas.

D:\CPRL SEVILLA\Direccion\DIRECCION\Direcci¢n2010\

Si aparece un '¢' en lugar de un 'ó', es por lo siguiente:

Lo normal, es que si estás trabajando en Windows, la codificación con la que estás trabajando sea la Windows-1252 (CP1252).

Si vas a la tabla que aparece ahí, verás que el '¢' corresponde al byte 162 (0xA2).

Y la codificación que corresponde a un 162 con un 'ó', en Windows, es la CP850 (o CP852). Si vas a esta tabla, en esa posición verás la letra tildada.

Resumiendo: el fichero de texto está codificado en CP850 (típico, si se trata de un fichero generado desde un programa que esté corriendo en MSDOS, como el robocopy), que, al cargarlo en un editor de textos Windows, aparece el carácter correspondiente en la codificación CP1252 (la que está usando Windows).

Ahora vamos a tu programa.

El 'use utf8' solo sirve para decir que DENTRO de tu programa vas a usar caracteres Unicode (por ejemplo, en las cadenas de texto LITERALES, que vas a escribir). No tiene nada que ver con la codificación de los ficheros.

Al binmode ENTRADA, 'utf8'; le faltan los ':' delante del 'utf8', igual a como lo tienes en la línea 3.

Yo supongo que es por este último detalle el porqué puedes ver correctamente en pantalla el nombre del fichero: porque no estás haciendo una conversión desde utf8. :)

En los Windows modernos, el sistema de ficheros está en cp1252. Y el contenido de los ficheros, a veces en ANSI (o utf16).

Y a esto le añades el hecho de que Perl trabaja internamente con latin1... Vamos, un lío.

En el hilo Nombres de ficheros con caracteres latinos en Windows tienes un ejemplo y explicación de lo que pasa.

Lo primero que hay que averiguar es la codificación de entrada (ya hemos dicho que es cp850), así que tendrás que cambiar las codificaciones que se usan en 'use open' del último ejemplo en ese hilo -no te valen así-.

No tengo un Windows a mano, hasta mañana por la mañana, así que no puedo ponerte un ejemplo. Intenta basarte en el que aparece en el hilo.

Bienvenido a la torre de Babel.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron