Página 1 de 1

Problema con codificación de fichero en Windows

NotaPublicado: 2010-08-18 08:17 @387
por empruebas
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.002 segundos, usando GeSHi 1.0.8.4


A ver si alguien me puede ayudar. Gracias.

Re: Problema con codificación de fichero en Windows

NotaPublicado: 2010-08-18 08:53 @412
por explorer
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.