Iuse locale
の場合、ロケール (et_EE.UTF-8) の一部の文字が一致\w
せず、理由がわかりません。
ASCII に加えて、エストニア語はさらに 6 つの文字を使用します。
õäöüšž
以下のテスト スクリプトでは、それら$string
を 3 つの追加の特殊文字ðŋц
(エストニアのアルファベットには属さない) と共に使用しています。
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: ðŋšžõäöüц
šžŋц
õäöüšžðŋц
私が期待したようではないのは何ですか?
- 主な問題: 6 文字すべてに一致する
use locale
ことを望んでいましたが、結果はかなり奇妙です。なぜそのような試合?perlrecharclassから私は読んだ:\w
šžŋц
255 を超えるコード ポイントの場合 ... \w は、この範囲の \p{Word} と同じように一致します。... 256 未満のコード ポイントの場合 ... ロケール ルールが有効な場合 ... \w は、プラットフォームのネイティブ アンダースコア文字と、ロケールが英数字と見なすものすべてに一致します。
したがって、\w
255 を超える文字には一致しますが、「ロケールが英数字と見なすもの」には一致しません。なんで?同時に、ロケールの下での並べ替えは正常に機能し (ロケールなしでは機能しません)、結果ðŋšžõäöüц
は正しい順序になり、適切な文字が適切に表現されていることが示されます。AFAIU、「ロケールが英数字と見なすものは何でも」それらを知らなければ、並べ替えはうまく機能しませんでした。または?
setlocale
locale-pragma の下でのみ結果が得られると思いました。どのロケールがスコープに有効かをテストするにはどうすればよいですか?- すべてのテストケースですべての文字が大文字になるとは思っていませんでした。AFAIU
uc
でありlc
、ロケールに依存する必要があります。最初のケースでは、それらはすべて小文字になると思っていましたが、ロケールを使用して、最初の 6 文字が大文字になるのを待っていましたが、他の文字はそうではありませんでした。すべての文字を大文字にして待っていたのは 3 番目でした。ここで重要な何かを見逃しているようです。おっと、今私はlc
ドキュメントから見つけました: UTF-8 フラグは常に my$string
に設定されているため、書き込み中に回答が得られました。
locale
並べ替えと照合に使用\p{Word}
することは私にとっては受け入れられますが、それでもいくつかのヒントを使用します:\w
期待どおりに機能しないのはなぜですか?