还有另一个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;
以上代码将为文件名中包含Á
的每个文件打印NFC-OK。但永远不会在NFD编码的文件系统上打印ENC-OK,因为opendir永远不会以\ x00C1的形式返回Á
,而是“A”,“重音”......
问题:如何正确编写适用于任何操作系统的上述代码?
答案 0 :(得分:2)
更具体地说,
NFC( decode('UTF-8', $_) ) =~ quotemeta( NFC( $name ) )
和
NFD( decode('UTF-8', $_) ) =~ quotemeta( NFD( $name ) )
适用于每个文件名,无论其形式如何。
......好吧,只要它是UTF-8编码的。除非使用chcp 65001,否则Windows上不会出现这种情况。