【问题标题】:Could File::Find::Rule be patched to automatically handle filename character encoding/decoding?是否可以修补 File::Find::Rule 以自动处理文件名字符编码/解码?
【发布时间】: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。那就是需要改变的地方。

标签: perl encoding utf-8


【解决方案1】:

是的,我希望。如果有一个主要的 Perl 项目我会从事,那就是它。

问题是可能存在编码错误的文件名,包括使用与预期不同的编码进行编码的文件名。这意味着首先需要的是一种通过解码-编码过程来回转换编码错误的文件名的方法。我认为 Python 使用代理对代码点来表示坏字节。

您需要一个编译指示来确保向后兼容性。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多