perl - 可以修补 File::Find::Rule 以自动处理文件名字符编码/解码吗?

标签 perl encoding utf-8

假设我在当前目录中有一个名称为 æ 的文件(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/

相关文章:

php - 使用 utf-8 文本输入通过 shell_exec 调用程序

linux - CPAN 安装模块显示正常,但该模块编译失败

perl - 是否可以有条件地将选项传递给perl中的方法?

ios - 在 ios9 中替换 stringByAddingPercentEscapesUsingEncoding?

r - 在 RStudio 控制台中显示西里尔文

mysql - UTF-8字符有问题;我看到的不是我存储的

php - 无法从mysql解析utf-8数据到php

perl - 从任何给定参数中过滤掉非数字,Perl 开头

perl - 如何使 wxPerl 在 Windows 上的 Perl 5.10 中工作?

java - HMAC 一个 php 字节数组