Por ejemplo, dado un archivo vacío テスト.txt
, ¿cómo haría una copia llamada テスト.txt.copy
?¿Cómo copio un archivo con un nombre de archivo UTF-8 a otro nombre de archivo UTF-8 en Perl en Windows?
Mi primera grieta en que logró acceder al archivo y crear el nuevo nombre de archivo, pero la copia generó テスト.txt.copy
.
Aquí fue mi primera grieta en ella:
#!/usr/bin/env perl
use strict;
use warnings;
use English '-no_match_vars';
use File::Basename;
use Getopt::Long;
use File::Copy;
use Win32;
my (
$output_relfilepath,
) = process_command_line();
open my $fh, '>', $output_relfilepath or die $!;
binmode $fh, ':utf8';
foreach my $short_basename (glob('*.txt')) {
# skip the output basename if it's in the glob
if ($short_basename eq $output_relfilepath) {
next;
}
my $long_basename = Win32::GetLongPathName($short_basename);
my $new_basename = $long_basename . '.copy';
print {$fh} sprintf(
"short_basename = (%s)\n" .
" long_basename = (%s)\n" .
" new_basename = (%s)\n",
$short_basename,
$long_basename,
$new_basename,
);
copy($short_basename, $new_basename);
}
printf(
"\n%s done! (%d seconds elapsed)\n",
basename($0),
time() - $BASETIME,
);
# === subroutines ===
sub process_command_line {
# default arguments
my %args
= (
output_relfilepath => 'output.txt',
);
GetOptions(
'help' => sub { print usage(); exit },
'output_relfilepath=s' => \$args{output_relfilepath},
);
return (
$args{output_relfilepath},
);
}
sub usage {
my $script_name = basename $0;
my $usage = <<END_USAGE;
======================================================================
Test script to copy files with a UTF-8 filenames to files with
different UTF-8 filenames. This example tries to make copies of all
.txt files with versions that end in .txt.copy.
usage: ${script_name} (<options>)
options:
-output_relfilepath <s> set the output relative file path to <s>.
this file contains the short, long, and
new basenames.
(default: 'output.txt')
----------------------------------------------------------------------
examples:
${script_name}
======================================================================
END_USAGE
return $usage;
}
aquí están los contenidos de output.txt
después de la ejecución:
short_basename = (BD9A~1.TXT)
long_basename = (テスト.txt)
new_basename = (テスト.txt.copy)
He intentado reemplazar File::Copy 's comando copy con una llamada al sistema:
my $cmd = "copy \"${short_basename}\" \"${new_basename}\"";
print `$cmd`;
y con Win32 :: CopyFile:
Win32::CopyFile($short_basename, $new_basename, 'true');
Lamentablemente, obtengo el mismo resultado en ambos casos (テスト.txt.copy
). Para la llamada al sistema, la impresión muestra 1 file(s) copied.
como se esperaba.
Notas:
- Estoy corriendo a través de Perl 5.10.0 Strawberry Perl en Windows 7 Professional
- utilizo el módulo Win32 acceder a los nombres de archivo largos
- Los rendimientos glob nombres de archivo cortos, que tengo a utilizar para acceder al archivo
- テ ス ト = prueba (tesuto) en katakana
- he leído y perlunitutThe Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
¿Cuál es la codificación predeterminada de Windows? EUC-JP? Shift_JIS? – Mike
Vea también http://stackoverflow.com/questions/2184726/how-do-i-create-a-unicode-directory-on- windows-using -perl –
Mike: De la lectura general y el uso de binmode ': utf8' I Creo que mi codificación predeterminada es utf-8, pero no estoy 100% seguro. Sinan: ¡Gracias por el enlace! – vlee