• Publicidad

Nombres de ficheros con caracteres latinos 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.

Nombres de ficheros con caracteres latinos en Windows

Notapor Dgrande » 2010-02-05 04:37 @234

Hola. A ver quién me puede echar una mano... Trabajo en una máquina con Win 7...

Quiero leer el fichero "datos.txt" y luego crear diferentes ficheros con el nombre de cada una de las líneas del fichero inicial.

Contenido fichero datos.txt:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
España
Español
Camión
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Creo el siguiente programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(FICHERO, "datos.txt");
  2. while(<FICHERO>) {
  3.     $Fila = "$_";
  4.     chomp($Fila);
  5.     push(@Filas,$Fila);
  6. }
  7. close(FICHERO);
  8.  
  9. foreach $Fila (@Filas) {
  10.     open(FICHERO_NUEVO, ">$Fila.txt");
  11.     print FICHERO_NUEVO "";
  12.     close FICHERO_NUEVO;
  13. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Me crea los nombres de los ficheros con algunos caracteres ilegibles...

Un saludo.
Última edición por explorer el 2010-02-05 11:05 @503, editado 3 veces en total
Razón: Ortografía, bloques de código
Dgrande
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-02-03 04:59 @249

Publicidad

Re: Nombre de ficheros con caracteres latinos en Windows

Notapor explorer » 2010-02-05 05:12 @258

Pues... se me ocurre que los nombres de los ficheros están en una determinada codificación, y el sistema de ficheros de Windows 7, que es NTFS, trabajará con Unicode (UTF-16).

(no probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open my $fichero, q[<], 'datos.txt' or die "ERROR: No puedo abrir datos.txt: $!\n";
binmode $fichero, ':utf8';

while (my $nombre = <$fichero>) {
    chomp $nombre;

    open my $fichero_nuevo, q[>], $nombre or die "ERROR: No puedo abrir $nombre: $!\n";
    print   $fichero_nuevo "";
    close   $fichero_nuevo;
}

close $fichero;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Re: Nombre de ficheros con caracteres latinos en Windows

Notapor Dgrande » 2010-02-05 05:49 @284

Hola.

Cuando el fichero a leer está codificado en ansi funciona bien pero si está codificado en utf8 es cuando me crea los caracteres mal con este programa y con el mio.

¿Cómo debo proceder entonces?

Saludos y gracias
Dgrande
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-02-03 04:59 @249

Re: Nombre de ficheros con caracteres latinos en Windows

Notapor explorer » 2010-02-05 08:00 @375

Este ejemplo me funciona (menos mal que tenía un Windows en el trabajo ;))
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!Perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use Encode 'from_to';
  7. use open IN  => ":encoding(utf8)",          # Codificación por defecto en la lectura de los ficheros
  8.          OUT => ":encoding(cp850)";         # Codificación por defecto en la escritura de los ficheros
  9. use open ':std';                            # La codificación indicada antes
  10.                                             # se copia a STDIN, STDOUT y STDERR
  11.  
  12. open my $fichero, q[<], 'datos.txt';        # Abrimos un fichero
  13.                                             # Será interpretado como 'utf8'
  14.  
  15. while (my $nombre = <$fichero>) {           # $nombre ha sido pasado de utf8 a
  16.     chomp $nombre;                          # la codificación interna de Perl
  17.  
  18.     $nombre =~ s/^\x{FEFF}//g if $. == 1;   # Quitamos el BOM de la primera línea (en caso de que esté)
  19.    
  20.     my $pantalla = $nombre;                 # Una copia
  21.  
  22.     print "$pantalla\n";                    # Sale en cp850 en consola,
  23.                                             # gracias al encoding() de STDOUT
  24.  
  25.     my $en_nombre_fichero = $nombre;        # Otra copia
  26.  
  27.                                             # pasamos de la codificación interna de Perl
  28.                                             # a la del sistema de ficheros (ANSI, que
  29.                                             # es la cp1252, normalmente)
  30.     from_to($en_nombre_fichero, 'latin1', 'cp1252');
  31.  
  32.                                             # el contenido del nuevo fichero será en 'cp850'
  33.     open my $fichero_nuevo, q[>], $en_nombre_fichero;
  34.     print   $fichero_nuevo "";
  35.     close   $fichero_nuevo;
  36. }
  37.  
  38. close $fichero;
  39.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

A mí me funciona, al menos, en un XP.

Humm... sí... sigo prefiriendo programar en Linux :)

Editado: Atención: sería "incorrecta" la línea del from_to(), asumiendo que el formato interno de Perl es Latin1. Más bien, habría que usar la función encode(), para pasar del formato interno a la que deseemos.
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

Re: Nombre de ficheros con caracteres latinos en Windows

Notapor Dgrande » 2010-02-05 09:26 @435

Me funcionó perfectamente, además de aclararme muchas cosas leyendo este código que me proporcionaste; en dos post me has enseñado varias cosas que me dificultaban el trabajo diario.

Un saludo y gracias.
Dgrande
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-02-03 04:59 @249


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 0 invitados