Как соответствовать Юникод гласные?

Какой символьный класс или свойство Unicode будет соответствовать любому гласному Unicode в Perl?

Неправильный ответ: [aeiouAEIOU], ( проповедь здесь, пункт № 24 в списке прачечной)

В perluniprops гласные упоминаются только для сценариев хангыль и инди.

Давайте оставим в стороне вопрос, что такое гласная. Да, i не может быть гласным в некоторых контекстах. Итак, подойдет любой персонаж, который может быть гласным.

3 ответа

Решение

Там нет такой собственности.

$ uniprops --all a
U+0061 <a> \N{LATIN SMALL LETTER A}
    \w \pL \p{LC} \p{L_} \p{L&} \p{Ll}
    AHex POSIX_XDigit All Alnum X_POSIX_Alnum Alpha X_POSIX_Alpha Alphabetic Any ASCII
       ASCII_Hex_Digit Assigned Basic_Latin ID_Continue Is_IDC Cased Cased_Letter LC
       Changes_When_Casemapped CWCM Changes_When_Titlecased CWT Changes_When_Uppercased CWU Ll L
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Hex X_POSIX_XDigit Hex_Digit IDC ID_Start
       IDS Letter L_ Latin Latn Lowercase_Letter Lower X_POSIX_Lower Lowercase PerlWord POSIX_Word
       POSIX_Alnum POSIX_Alpha POSIX_Graph POSIX_Lower POSIX_Print Print X_POSIX_Print Unicode Word
       X_POSIX_Word XDigit XID_Continue XIDC XID_Start XIDS
    Age=1.1 Age=V1_1 Block=Basic_Latin Bidi_Class=L Bidi_Class=Left_To_Right BC=L
       Bidi_Paired_Bracket_Type=None Block=ASCII BLK=ASCII Canonical_Combining_Class=0
       Canonical_Combining_Class=Not_Reordered CCC=NR Canonical_Combining_Class=NR
       Decomposition_Type=None DT=None East_Asian_Width=Na East_Asian_Width=Narrow EA=Na
       Grapheme_Cluster_Break=Other GCB=XX Grapheme_Cluster_Break=XX Hangul_Syllable_Type=NA
       Hangul_Syllable_Type=Not_Applicable HST=NA Indic_Positional_Category=NA InPC=NA
       Indic_Syllabic_Category=Other InSC=Other Joining_Group=No_Joining_Group JG=NoJoiningGroup
       Joining_Type=Non_Joining JT=U Joining_Type=U Script=Latin Line_Break=AL
       Line_Break=Alphabetic LB=AL Numeric_Type=None NT=None Numeric_Value=NaN NV=NaN
       Present_In=1.1 IN=1.1 Present_In=2.0 IN=2.0 Present_In=2.1 IN=2.1 Present_In=3.0 IN=3.0
       Present_In=3.1 IN=3.1 Present_In=3.2 IN=3.2 Present_In=4.0 IN=4.0 Present_In=4.1 IN=4.1
       Present_In=5.0 IN=5.0 Present_In=5.1 IN=5.1 Present_In=5.2 IN=5.2 Present_In=6.0 IN=6.0
       Present_In=6.1 IN=6.1 Present_In=6.2 IN=6.2 Present_In=6.3 IN=6.3 Present_In=7.0 IN=7.0
       Present_In=8.0 IN=8.0 SC=Latn Script=Latn Script_Extensions=Latin Scx=Latn
       Script_Extensions=Latn Sentence_Break=LO Sentence_Break=Lower SB=LO Word_Break=ALetter WB=LE
       Word_Break=LE

Самое главное при работе с i18n - подумать о том, что вам действительно нужно, но вы даже не упомянули, чего пытаетесь достичь.

Найти гласные? Это не может быть тем, что вы на самом деле пытаетесь сделать. Я мог видеть использование для идентификации гласных звуков в слове, но они часто формируются из нескольких букв (таких как "oo" на английском языке и "in", "an" / "en", "ou", "ai", "au" / "eau", "eu" на французском), и это будет зависеть от языка.

В настоящее время вы просите о глобальном решении, но вы определяете проблему в местных терминах. Сначала нужно определить реальную проблему, которую вы пытаетесь решить.

Если оставить в стороне определение гласной и очевидную проблему, заключающуюся в том, что разные языки используют общие символы, но используют их по-разному, есть способ определить собственное свойство для использования в шаблоне Perl.

Определите подпрограмму, которая начинается с Inили же Isи указать символы, которые могут быть в нем. Простейшим является один кодовый номер в строке или диапазон кодовых номеров, разделенных горизонтальными пробелами:

      #!perl
use v5.10;
use utf8;
use open qw(:std :utf8);

sub InSpecial {
    return <<"HERE";
00A7
00B6
2295\t229C
HERE
}


$_ = "ABC\x{00A7}";

say $_;
say /\p{InForeign}/ ? 'Matched' : 'Missed';

Во-первых, не во всех письменных языках есть «гласные». (Например, 中文 (Zhōngwén) (письменный китайский) нет, поскольку он идеограмматический, а не фонетический. Другой пример, в японском языке в основном нет; он использует в основном согласный + гласный хирагана или слоговое письмо катакана, такое как "га", вместо "ва", "цу".)

А некоторые письменные языки (например, хинди, бангла, греческий, русский) действительно имеют гласные, но используют символы, которые нелегко сопоставить с aeiou. Для таких языков вам нужно будет найти (поиск по метакпанам?) Или составить справочную таблицу, указав, какие буквы являются «гласными».

Но если вы имеете дело с любым письменным языком, основанным даже на латинском алфавите (abcdefghijklmnopqrstuvwxyz), даже если в языке используется множество диакритических знаков (в кругах Perl и Unicode это называется «объединение знаков») (например, вьетнамский), вы можете легко сопоставьте их с "гласными" или "не гласными", да. Способ состоит в том, чтобы «нормализовать-полностью-разложить-форму», затем удалить все объединяющие знаки, затем свернуть регистр, а затем сравнить каждую букву с регулярным выражением /[aeiou]/. Следующий сценарий Perl найдет почти все «гласные» на любом языке с использованием латинского алфавита:

      #!/usr/bin/perl -CSDA
# vowel-count.pl
use v5.20;
use Unicode::Normalize 'NFD';
my $vcount;
while (<>)
{
   $_ =~ s/[\r\n]+$//;
   say "\nRaw string: $_";
   my $decomposed = NFD $_;
   my $stripped = ($decomposed =~ s/\pM//gr);
   say "Stripped string: $stripped";
   my $folded = fc $stripped;
   my @base_letters = split //, $stripped;
   $vcount = 0;
   /[aeiou]/ and ++$vcount for @base_letters;
   say "# of vowels: $vcount";
}
Другие вопросы по тегам