Почему символы слов (\ w) не совпадают прямо под прагмой использования локали?

Когда яuse localeнекоторые символы из моей локали (et_EE.UTF-8) не совпадают с\w и я неТам нет никакой причины.

Помимо ASCII, в эстонском языке используются еще шесть символов: õäöüšž

В моем тестовом скрипте ниже я использую их в$string с тремя дополнительными специальными символамиðŋц (которые не относятся к эстонскому алфавиту).

use feature 'say';
use POSIX qw( locale_h );

{
  use utf8;
  my  $string = "õäöüšž ðŋц";
  binmode STDOUT, ":encoding(UTF-8)";
  say "nothing";
  say 'LOCALE: ', setlocale(LC_CTYPE), ' ', setlocale(LC_COLLATE);
  say 'UC: ', uc( $string );
  say 'SORT: ', sort( split(//, $string) );
  say $string =~ m/\w/g;
  say $string =~ m/\p{Word}/g;
  say '';
}

{
  use utf8;
  use locale;
  binmode STDOUT, ":encoding(UTF-8)";
  my  $string = "õäöüšž ðŋц";
  say "locale";
  say 'LOCALE: ', setlocale(LC_CTYPE), ' ', setlocale(LC_COLLATE);
  say 'UC: ', uc( $string );
  say 'SORT: ', sort( split(//, $string) );
  say $string =~ m/\w/g;
  say $string =~ m/\p{Word}/g;
  say '';
}

{
  use utf8::all;
  my  $string = "õäöüšž ðŋц";
  say "utf8::all";
  say 'LOCALE: ', setlocale(LC_CTYPE), ' ', setlocale(LC_COLLATE);
  say 'UC: ', uc( $string );
  say 'SORT: ', sort( split(//, $string) );
  say $string =~ m/\w/g;
  say $string =~ m/\p{Word}/g;
  say '';
}

{
  use utf8::all;
  use locale;
  my  $string = "õäöüšž ðŋц";
  say "utf8::all + locale";
  say 'LOCALE: ', setlocale(LC_CTYPE), ' ', setlocale(LC_COLLATE);
  say 'UC: ', uc( $string );
  say 'SORT: ', sort( split(//, $string) );
  say $string =~ m/\w/g;
  say $string =~ m/\p{Word}/g;
  say '';
}

Я попытался с Perl 5.10.1 и 5.14.2, и оба дали мне такой вывод:

nothing
LOCALE: et_EE.UTF-8 et_EE.UTF-8
UC: ÕÄÖÜŠŽ ÐŊЦ
SORT:  äðõöüŋšžц
õäöüšžðŋц
õäöüšžðŋц

locale
LOCALE: et_EE.UTF-8 et_EE.UTF-8
UC: ÕÄÖÜŠŽ ÐŊЦ
SORT:  ðŋšžõäöüц
šžŋц
õäöüšžðŋц

utf8::all
LOCALE: et_EE.UTF-8 et_EE.UTF-8
UC: ÕÄÖÜŠŽ ÐŊЦ
SORT:  äðõöüŋšžц
õäöüšžðŋц
õäöüšžðŋц

utf8::all + locale
LOCALE: et_EE.UTF-8 et_EE.UTF-8
UC: ÕÄÖÜŠŽ ÐŊЦ
SORT:  ðŋšžõäöüц
šžŋц
õäöüšžðŋц

Что не так, как я ожидал?

Основная проблема: подuse locale Я надеялся, что\w чтобы соответствовать всем моим шести символам, но результатšžŋц довольно странно. Почему такие спички? Отperlrecharclass Я читаю:

Для кодовых точек выше 255 ... \ w совпадает с совпадением \ p {Word} в этом диапазоне. ... Для кодовых точек ниже 256 ... если действуют правила локали ... \ w соответствует платформе 'родной символ подчеркивания плюс все, что локаль считает буквенно-цифровой.

Так,\w совпадает с символами выше 255, но не совпадаеткакой бы локаль ни считала буквенно-цифровой, Зачем? В то же время сортировка в локали работает нормально (а без локали нет), результатðŋšžõäöüц правильный порядок, который показывает, что правильные символы правильно представлены. AFAIU, сортировка не может работать нормально, не зная их "какой бы локаль ни считала буквенно-цифровой, Или же?

я думал такsetlocale дает результат только под locale-pragma. Как я могу проверить, какой язык эффективен для области?Я не ожидал, что все символы в верхнем регистре в каждом тестовом случае. AFAIUuc а такжеlc должен зависеть от локали. В первом случае я думал, что все они будут в нижнем регистре, но используя локаль, я ждал, что первые шесть символов будут в верхнем регистре, а другие нет. Единственный случай, когда я ждал все символы в верхнем регистре, был третьим. Я вижу, что я пропускаю что-то важное здесь. Ой, теперь я нашел изlc документы: "В противном случае, если EXPR имеет установленный флаг UTF-8: семантика Unicode используется для изменения регистра. " Флаг UTF-8 всегда установлен на моем$string, так что это получил ответ во время написания этого.

С помощьюlocale для сортировки и\p{Word} для соответствия приемлемо для меня, но я все еще хотел бы использовать некоторые подсказки: почему\w не работает, как я ожидал?

Ответы на вопрос(1)

Ваш ответ на вопрос