Este ejemplo me funciona (menos mal que tenía un Windows en el trabajo
)
Using perl Syntax Highlighting
#!Perl
use strict;
use warnings;
use diagnostics;
use Encode 'from_to';
use open IN => ":encoding(utf8)", # Codificación por defecto en la lectura de los ficheros
OUT => ":encoding(cp850)"; # Codificación por defecto en la escritura de los ficheros
use open ':std'; # La codificación indicada antes
# se copia a STDIN, STDOUT y STDERR
open my $fichero, q[<], 'datos.txt'; # Abrimos un fichero
# Será interpretado como 'utf8'
while (my $nombre = <$fichero>) { # $nombre ha sido pasado de utf8 a
chomp $nombre; # la codificación interna de Perl
$nombre =~ s/^\x{FEFF}//g if $. == 1; # Quitamos el BOM de la primera línea (en caso de que esté)
my $pantalla = $nombre; # Una copia
print "$pantalla\n"; # Sale en cp850 en consola,
# gracias al encoding() de STDOUT
my $en_nombre_fichero = $nombre; # Otra copia
# pasamos de la codificación interna de Perl
# a la del sistema de ficheros (ANSI, que
# es la cp1252, normalmente)
from_to($en_nombre_fichero, 'latin1', 'cp1252');
# el contenido del nuevo fichero será en 'cp850'
open my $fichero_nuevo, q[>], $en_nombre_fichero;
print $fichero_nuevo "";
close $fichero_nuevo;
}
close $fichero;
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.