Правильная и портативная нормализация имени файла utf8
У вас есть еще один вопрос 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 для каждого файла, содержащего Á
в имени файла. Но никогда не будет печатать ENC-OK, в NFD-кодированной файловой системе, потому что opendir никогда не возвращает Á
в форме \x00C1, но "A", "accent"...
Вопрос: как правильно написать приведенный выше код для любой ОС?
Ответы
Ответ 1
Более конкретно,
NFC( decode('UTF-8', $_) ) =~ quotemeta( NFC( $name ) )
и
NFD( decode('UTF-8', $_) ) =~ quotemeta( NFD( $name ) )
работает для каждого имени файла, не зависящего от его формы.
... Ну, пока кодируется UTF-8. Thatt не будет иметь место в Windows, кроме, может быть, при использовании chcp 65001.