#!/usr/local/bin/perl
use warnings;
use strict;
use utf8;
use Encode qw(encode);
my $dir = '/data/Delibes, Léo';
if ( -d $dir ) {
print "OK\n";
}
if ( -d encode 'utf8', $dir ) {
print "OK\n";
}
这打印2次OK
;我想这是因为Perl在内部将$dir
存储为utf8。
我有办法检查PerlIO::fse是否对filetest运算符产生影响,只要perl和文件系统存储在utf8
中?
编辑:
#!/usr/local/bin/perl
use warnings;
use 5.014;
binmode STDOUT, 'utf8';
use utf8;
my $dir1 = 'é';
my $dir2 = chr(0xE9);
opendir my $dh1, $dir1 or warn '1: ', $!;
say "OK1" if -d $dir1;
opendir my $dh2, $dir2 or warn '2: ', $!;
say "OK2" if -d $dir2;
utf8::upgrade( $dir1 );
utf8::upgrade( $dir2 );
opendir my $dh3, $dir1 or warn '3: ', $!;
say "OK3" if -d $dir1;
opendir my $dh4, $dir2 or warn '4: ', $!;
say "OK4" if -d $dir2;
# OK1
# 2: Datei oder Verzeichnis nicht gefunden at ./temp1.pl line 12.
# OK3
# OK4
也许我还没有完全理解PerlIO::fse
的工作原理 - 在这个例子中我看不到来自PerlIO::fse
的任何影响:
#!/usr/local/bin/perl
use warnings;
use 5.014;
binmode STDOUT, 'utf8';
use utf8;
use PerlIO::fse 'utf-8';
my $dir1 = 'é';
my $dir2 = chr(0xE9);
opendir my $dh1, $dir1 or warn '1: ', $!;
say "OK1" if -d $dir1;
opendir my $dh2, $dir2 or warn '2: ', $!;
say "OK2" if -d $dir2;
# OK1
# 2: Datei oder Verzeichnis nicht gefunden at ./temp1.pl line 13.
答案 0 :(得分:1)
测试:
my $file_name = chr(0xE9); # e acute.
utf8::downgrade($file_name);
my $file_name = chr(0xE9);
utf8::upgrade($file_name);
如果首先不是UTF-8编码的话,第一个会产生UTF-8语言环境中的垃圾。
如果第一个没有编码,第二个将在其他语言环境中产生垃圾。
(他们假设是相同的,但是大多数/所有内置文件中都存在一个带有文件名的错误,这个错误阻止您正确地测试它。)