2017-01-19 1 views
2

this question에 대한 디버깅을 수행하는 동안 나는 주어진 유니 코드 포인트에 대해 \N{}에서 사용할 수있는 모든 값을 어떻게 찾습니까?특정 코드 포인트를 생성하기 위해 N {}에서 사용할 수있는 모든 값을 얻으려면 어떻게해야합니까?

예를 들어 U + 03B1 (GREEK SMALL LETTER ALPHA)의 모든 별칭을 알고 싶습니다. 이 경우 \N{greek:alpha}을 어떻게 사용할 수 있습니까?

+0

관련 : [A 코드 포인트에 대한 모든 유니 코드 별칭을 얻기] (http://stackoverflow.com/questions/37663788/getting-all-unicode-aliases-for-a-codepoint) (처음으로 플래그 중복이지만, 유니 코드 별칭뿐만 아니라 해당 코드 포인트에 대해'\ N {}'에서 사용할 수있는 모든 것을 묻는 것처럼 들린다. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot, Not Not. 'greek : alpha'는 Perl이 생성 한 것입니다. 그것은 UCD에서 (직접적으로) 아닙니다. – ikegami

+0

@ikegami 네, 방금 투표를 취소했습니다. – ThisSuitIsBlackNot

답변

3

위의 사항을 확인하는 단일 목록은 없습니다. 예를 들어

use List::Util qw(max); 
use Unicode::UCD qw(charscripts charinfo charprop); 

my $re_scripts = join '|', map { quotemeta uc s/_/ /gr } keys %{ charscripts() }; 
my $re_letter = qr/^($re_scripts) (?:(CAPITAL|SMALL))?LETTER (\S.*)/; 

{ 
    @ARGV == 1 
    or die("usage\n"); 

    my $ucp = hex($ARGV[0] =~ s/^(?:U\+|0x)//r); 

    my @names; 
    push @names, [ "", sprintf('U+%X', $ucp) ]; 

    if (my $charinfo = charinfo($ucp)) { 
     my $name = $charinfo->{name}; 
     push @names, [ ":full", $name ] if length($name) && $name ne '<control>'; 

     for my $alias (map s/:.*//sr, split /,/, charprop($ucp, 'Name_Alias')) { 
     push @names, [ ":full", $alias ]; 
     } 

     if (my ($script_name, $type, $short_char_name) = $name =~ $re_letter) { 
     my $uc = ($type // 'CAPITAL') eq 'CAPITAL'; 
     my $lc = ($type // 'SMALL' ) eq 'SMALL'; 
     push @names, [ ":short", join(":", $script_name, uc($short_char_name)) ] if $uc; 
     push @names, [ ":short", join(":", $script_name, lc($short_char_name)) ] if $lc; 
     push @names, [ $script_name, uc($short_char_name) ] if $uc; 
     push @names, [ $script_name, lc($short_char_name) ] if $lc; 
     } 
    } 

    my $longuest = max map length($_->[0]), @names; 
    say sprintf("use charnames qw(%-*s); \"\\N{%s}\"", $longuest, @$_) for @names; 
} 

,

$ ./script.pl U+03B1 
use charnames qw(  ); "\N{U+3B1}" 
use charnames qw(:full ); "\N{GREEK SMALL LETTER ALPHA}" 
use charnames qw(:short); "\N{GREEK:alpha}" 
use charnames qw(GREEK ); "\N{alpha}" 

$ ./script.pl U+0391 
use charnames qw(  ); "\N{U+391}" 
use charnames qw(:full ); "\N{GREEK CAPITAL LETTER ALPHA}" 
use charnames qw(:short); "\N{GREEK:ALPHA}" 
use charnames qw(GREEK ); "\N{ALPHA}" 

$ perl a.pl 1C00 
use charnames qw(  ); "\N{U+1C00}" 
use charnames qw(:full ); "\N{LEPCHA LETTER KA}" 
use charnames qw(:short); "\N{LEPCHA:KA}" 
use charnames qw(:short); "\N{LEPCHA:ka}" 
use charnames qw(LEPCHA); "\N{KA}" 
use charnames qw(LEPCHA); "\N{ka}" 

$ ./script.pl 20 
use charnames qw(  ); "\N{U+20}" 
use charnames qw(:full); "\N{SPACE}" 
use charnames qw(:full); "\N{SP}" 

참고 : charnames.pm 가져 오기에

  • 스크립트의 이름을 documentation\N{}의 바탕으로

    , 다음 트릭을 할 것입니다 매개 변수는 대소 문자를 구분하지 않습니다.

  • 출력에 use charnames qw();의 인스턴스 (즉, 매개 변수없이 charnames.pm을로드하는 명령문)는 실제로 필요하지 않습니다.
  • Perl 5.16부터 \N{}이 나오기 전에 charnames.pm이로드되지 않으면 use charnames qw(:full :short);을 사용하여 암시 적으로로드됩니다.
  • 효과가있는 사용자 정의 별칭이 나열되지 않습니다. (기술적으로, 당신은 스크립트를 수정하지 않는 한이 없습니다.)
  • 이름은 다음과 같은 예외가 정확히 출력으로 제공해야합니다 : U+ 다음
    • 수는 대소 문자를 구분합니다.
    • U+ 다음에 오는 숫자는 0을 가질 수 있습니다.
    • :short의 스크립트 이름은 대/소문자를 구분하지 않습니다.
    • 대문자 이름은 :short이고 스크립트 문자 이름은 대소 문자를 구분하지 않지만 대문자를 하나 이상 포함해야합니다.
    • use charnames qw(:loose);을 사용하면 표시된 문자열을 추가로 변형 할 수 있습니다.
+0

이것을 유니 코드 :: UCD에 추가해야합니다. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlack 아닙니다. 아니요, 사용하는 것 외에는 UCD와 아무 관련이 없습니다. CPAN에 별도의 모듈로 배치 할 수는 있지만 비교 가능한 제품이 없기 때문에 매우 제한적입니다. 정규 표현식 패턴이 일치하는 모든 문자열을 생성하는 하위를 요청하는 것과 같습니다. 내가 게시 한 함수는'\ N {}'을 문서화하는 것 이상을 수행하지 않으며, 그럼에도 불구하고 실제의 [documentation] (http://search.cpan.org/perldoc)보다 긴 모든 주석으로 만 수행합니다. ? charnames)를'\ N {}'에 사용합니다. – ikegami

+0

그냥 멋지다! 정확히 내가 무엇을 찾고 있었는지 – yulivee

관련 문제