正确和便携的utf8文件名规范化

caj*_*ine 12 perl portability utf-8

还有另一个perl/utf8问题:

码:

use 5.012;
use utf8;
use strict;
use warnings;
use feature qw(unicode_strings);

use open qw(:std :utf8);
use Encode qw(encode decode);
use charnames qw(:full);
use Unicode::Normalize qw(NFD NFC);

my $name = "\N{U+00C1}";        # Á (UPPERCASE A WITH ACUTE)

opendir(my $dh, ".") || die "error opendir";
while(readdir $dh) {
    say "ENC-OK" if      decode('UTF-8', $_)   =~ $name; #never true
    say "NFC-OK" if NFC( decode('UTF-8', $_) ) =~ $name; #true
}
closedir $dh;
Run Code Online (Sandbox Code Playgroud)

上面的代码将为文件Á名中包含的每个文件打印NFC-OK .但永远不会在NFD编码的文件系统上打印ENC-OK,因为opendir永远不会Á以\ x00C1的形式返回,而是"A","重音"......

问题:如何正确编写上述代码适用于任何操作系统?

ike*_*ami 2

进一步来说,

NFC( decode('UTF-8', $_) ) =~ quotemeta( NFC( $name ) )
Run Code Online (Sandbox Code Playgroud)

NFD( decode('UTF-8', $_) ) =~ quotemeta( NFD( $name ) )
Run Code Online (Sandbox Code Playgroud)

适用于每个文件名,无论其形式如何。

...好吧,只要它是 UTF-8 编码的。Windows 上不会出现这种情况,除非使用 chcp 65001。