end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

Unicodeプロパティによる文字種の判別

developer.hatenastaff.com ↑こちらを読んで、↓こちらを思い出した。 end0tknr.hateblo.jp

unicode.org のお陰で、文字種の判別は随分、楽になりましたが

  • 「①」「㈱」等のいわゆる機種依存文字の判別が自分の認識と異なる。
  • 「A」「A」等の全角英数字の判別が自分の認識と異なる。
  • 「斎藤」「斉藤」「齋藤」を簡単に同一視したい。

で、モヤモヤが解消しきれていない。地道に行くしかないんですかねぇ

参考url

なんとなく、確認用のscriptを書いてみたけど...

特に意味はありません。ただの写経です

#!/usr/local/bin/perl
use strict;
use utf8;
use Encode;

# http://perldoc.jp/docs/perl/5.10.0/perlunicode.pod#Unicode32Character32Properties
# http://developer.hatenastaff.com/entry/2016/05/31/123457
# http://js-next.hatenablog.com/entry/2016/04/21/013010
# http://unicode.org/Public/UNIDATA/ScriptExtensions.txt
main();

sub main {

#    chk_General_Category();
#    chk_Script();
    chk_Script_Extensions();
#    chk_East_Asian_Width();

}

sub chk_General_Category { # 一般カテゴリ

    my $uc_prop_type = 'General_Category';  #

    for my $char ( qw/A A a a あ ア ア/ ){
        my @uc_prop_vals =
            ('Letter',          #表音文字・表語文字
             'UppercaseLetter', #大文字
             'OtherLetter');    #他の文字
        for my $uc_prop_val ( @uc_prop_vals ){
            chk_unicode_prop($uc_prop_type, $uc_prop_val,$char);
        }
    }

    for my $char ( qw/1 1 ① 一 , . ,/ ){
        my @uc_prop_vals =
            ('Number',
             'DecimalNumber',
             'LetterNumber',
             'OtherNumber');
        for my $uc_prop_val ( @uc_prop_vals ){
            chk_unicode_prop($uc_prop_type, $uc_prop_val,$char);
        }
    }
}

# http://www.unicode.org/Public/UNIDATA/Scripts.txt
sub chk_Script { #

    my $uc_prop_type = 'Script';

    for my $char ( qw/亜 あ ア ア 一 ー α/ ){
        my @uc_prop_vals =
            ('Katakana',
             'Han',
             'Common');
        for my $uc_prop_val ( @uc_prop_vals ){
            chk_unicode_prop($uc_prop_type, $uc_prop_val,$char);
        }
    }
}

sub chk_Script_Extensions { #

    my $uc_prop_type = 'Script_Extensions';

    for my $char ( qw/亜 あ ア ア 一 ー α ㈱/ ){
        my @uc_prop_vals =
            ('Hiragana',
             'Katakana',
             'Han',
             'Common');
        for my $uc_prop_val ( @uc_prop_vals ){
            chk_unicode_prop($uc_prop_type, $uc_prop_val,$char);
        }
    }
}

sub chk_East_Asian_Width { #

    my $uc_prop_type = 'East_Asian_Width';

    for my $char ( qw/あ ア ア ㈱ ① 1 1/ ){
        my @uc_prop_vals =
            ('Wide',
             'Narrow',
             'Ambiguous',
            );
        for my $uc_prop_val ( @uc_prop_vals ){
            chk_unicode_prop($uc_prop_type, $uc_prop_val,$char);
        }
    }
}



sub chk_unicode_prop {
    my ($uc_prop_type,$uc_prop_val, $char) = @_;

    my $uc_prop_type_val = join('=',$uc_prop_type, $uc_prop_val);
    if( $char =~ m/\p{$uc_prop_type_val}/){
        print encode('utf8',
                     "'$char' = $uc_prop_type_val .\n");
        return;
    }
    print encode('utf8',
                 "'$char' ≠ $uc_prop_type_val .\n");
}

1;