假设我在当前目录中有一个名称为 æ
的文件(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
??)
最佳答案
是的,我希望。如果有一个主要的 Perl 项目是我要从事的,那就是它。
问题是可能存在编码错误的文件名,包括使用与预期不同的编码方式编码的文件名。这意味着首先需要的是一种通过解码-编码过程来回传输错误编码文件名的方法。我认为 Python 使用代理对代码点来表示坏字节。
您需要一个编译指示来确保向后兼容性。
关于perl - 可以修补 File::Find::Rule 以自动处理文件名字符编码/解码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31383690/