还有另一个 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”、“口音”...问题:如何为任何操作系统正确编写上述代码可移植?
最佳答案
进一步来说,
NFC( decode('UTF-8', $_) ) =~ quotemeta( NFC( $name ) )
和
NFD( decode('UTF-8', $_) ) =~ quotemeta( NFD( $name ) )
适用于任何形式的文件名。
...嗯,只要它是 UTF-8 编码的。在 Windows 上情况并非如此,除非使用 chcp 65001 时。
关于perl - 正确且可移植的 utf8 文件名规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857208/