2010年04月23日 07:00 [Edit]

perl - Unicode「'あ'はAlphabetですが、何か?」

camel

結論から言うと、仕様です。

Is "あ" an alphabet? - FloralCompany.log
use utf8;
print 1 if "あ" =~ /\p{IsAlpha}/;
print 2 if "あ" =~ /\p{Alphabetic}/;
print 3 if "あ" =~ /[[:alpha:]]/;
ナンデヤネーン

それも、PerlではなくUnicodeの。


UAX #44: Unicode Character Database
Characters with the Alphabetic property. For more information, see Chapter 4 in [Unicode].
Generated from: Lu + Ll + Lt + Lm + Lo + Nl + Other_Alphabetic

で、以下のScriptを試してみると、'あ' = U+3042 は\p{Lo}であることがわかります。

use strict;
use warnings;
use Data::Dumper;
use Unicode::UCD 'charinfo';
use utf8;
print Dumper charinfo(ord "あ");

こうなっているのはカナだけではありません。

use strict;
use warnings;
use utf8;
binmode STDOUT, ":utf8";
my @chars = qw/A Ω Б あ ン 漢 한 ㄆ ฒ ᡇ א أ ლ æ̀ /;
print "$_ is ", (/\A\p{Alphabetic}\z/ ? '' : 'NOT '), "alphabetic.\n" for @chars;

漢字もハングルもボポモフォもタイ文字もモンゴル文字もアラビア文字もヘブライ文字も今ちょっとした流行りのグルジア文字もみーんなAlphabeticなのです。ちなみに最後の発音記号はさすがにAlphabeticではありません。

ちなみに Perl 5.12 からは \p{PosixAlpha}というのが別に用意されてます。が、[A-Za-z]の方が短くて分かりやすいというのがなんとも。

Dan the (Perl Monger|Unicode Mangled)

追記 2014.04.09


この記事へのトラックバックURL

この記事へのコメント
文章を表すための文字集合、ということです。

したがって、キリル文字も、ヘブライ文字もアラビア文字もタイ文字もalphabet です。

alphabet= 英語を記述するための文字集合[A-Za-z]、と条件反射するのは
下記を母語とする人たちだけです。
Japanese, Korean, Chinese
Posted by senbeyya at 2010年04月25日 13:38
記号以外は全部Alphabetって事じゃないですか。
ギリシャ文字 the Greek alphabet
ローマ文字 the Roman alphabet
かな文字 the Japanese alphabet

Posted by azaelia at 2010年04月24日 11:23
? あ U+3042 は UTF-8でエンコードするとエスケープされて
E3 81 82 なので A-Za-zにはかぶらないのになんでですか?
もう少し詳しくお願いします。
Posted by p-6806241 at 2010年04月23日 10:39