12

別の 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 を出力Áします。ただし、opendir が \x00C1 の形式で返されることはないため、NFD でエンコードされたファイルシステムでは ENC-OK を出力することはありませんÁが、"A"、"accent"...

質問: 上記のコードを任意の OS に正しく移植するにはどうすればよいですか?

4

1 に答える 1

2

すなわち、

NFC( decode('UTF-8', $_) ) =~ quotemeta( NFC( $name ) )

NFD( decode('UTF-8', $_) ) =~ quotemeta( NFD( $name ) )

その形式に関係なく、すべてのファイル名に対して機能します。

...まあ、UTF-8 でエンコードされている限り。chcp 65001 を使用している場合を除いて、Windows ではそうではありません。

于 2012-06-01T21:21:48.620 に答える