【发布时间】:2015-10-01 17:40:27
【问题描述】:
假设我在当前目录中有一个名为 æ (UNICODE : 0xE6, UTF8 : 0xC3 0xA6) 的文件。
然后,我想使用File::Find::Rule 来定位它:
use feature qw(say);
use open qw( :std :utf8 );
use strict;
use utf8;
use warnings;
use File::Find::Rule;
my $fn = 'æ';
my @files = File::Find::Rule->new->name($fn)->in('.');
say $_ for @files;
输出是空的,所以显然这不起作用。
如果我先尝试对文件名进行编码:
use Encode;
my $fn = 'æ';
my $fn_utf8 = Encode::encode('UTF-8', $fn, Encode::FB_CROAK | Encode::LEAVE_SRC);
my @files = File::Find::Rule->new->name($fn_utf8)->in('.');
say $_ for @files;
输出是:
æ
所以它找到了文件,但是返回的文件名没有被解码成 Perl 字符串。为了解决这个问题,我可以对结果进行解码,将最后一行替换为:
say Encode::decode('UTF-8', $_, Encode::FB_CROAK) for @files;
问题是编码和解码是否可以/应该由File::Find::Rule 自动完成,这样我就可以使用我的原始程序而完全不必担心编码和解码?
(例如,File::Find::Rule 是否可以使用 I18N::Langinfo 来确定当前语言环境的代码集是 UTF-8 ??)
【问题讨论】:
-
F::F::R 只需使用
readdir。那就是需要改变的地方。