我正在使用Perl对其名称中包含非ASCII字符的文件进行存在检查.即使文件存在,检查也始终返回false.我在Windows 10机器上使用Strawberry Perl v5.24.0.
这是我的代码:
use strict; use warnings; use Encode; my $file = '/ áéíóú.mov'; if (-e $file) { print "$file exists"; } else { print " $file does not exists" ; }
我还通过运行更改了cmd shell中的代码页chcp 65001
.然后cmd能够识别字符但不知何故它总是返回此文件的"Not Exists".
我怎样才能解决这个问题?
use strict; use warnings; # Properly decode source code, which is expected to be UTF-8. # This allows non-ASCII characters in the source. use utf8; # Properly decode text received from STDIN. # Properly encode text sent to STDOUT and STDERR. use Win32 qw( ); my ( $enc_in, $enc_out, $enc_syscall ); BEGIN { $enc_input = 'cp'.Win32::GetConsoleCP(); $enc_output = 'cp'.Win32::GetConsoleOutputCP(); $enc_syscall = 'cp'.Win32::GetACP(); binmode STDIN, ":encoding($enc_input)"; binmode STDOUT, ":encoding($enc_output)"; binmode STDERR, ":encoding($enc_output)"; } use Encode qw( encode ); my $file = 'áéíóú.mov'; if (-e encode($enc_syscall, $file, Encode::FB_CROAK | Encode::LEAVE_SRC)) { print("$file exists\n"); } elsif ($!{ENOENT}) { print("$file doesn't exist\n"); } else { die("Can't determine if \"$file\" exists: $!\n"); }
要么
use strict; use warnings; # Properly decode source code, which is expected to be UTF-8. # This allows non-ASCII characters in the source. use utf8; # Properly decode text received from STDIN. # Properly encode text sent to STDOUT and STDERR. use Win32 qw( ); my ( $enc_in, $enc_out, $enc_syscall ); BEGIN { $enc_input = 'cp'.Win32::GetConsoleCP(); $enc_output = 'cp'.Win32::GetConsoleOutputCP(); $enc_syscall = 'cp'.Win32::GetACP(); binmode STDIN, ":encoding($enc_input)"; binmode STDOUT, ":encoding($enc_output)"; binmode STDERR, ":encoding($enc_output)"; } use Win32::Unicode::File qw( statW ); my $file = 'áéíóú.mov'; if (statW($file)) { print("$file exists\n"); } elsif ($!{ENOENT}) { print("$file doesn't exist\n"); } else { die("Can't determine if \"$file\" exists: $^E\n"); }
后者不仅限于包含机器ANSI字符集字符的路径.