this question에 대한 디버깅을 수행하는 동안 나는 주어진 유니 코드 포인트에 대해 \N{}
에서 사용할 수있는 모든 값을 어떻게 찾습니까?특정 코드 포인트를 생성하기 위해 N {}에서 사용할 수있는 모든 값을 얻으려면 어떻게해야합니까?
예를 들어 U + 03B1 (GREEK SMALL LETTER ALPHA)의 모든 별칭을 알고 싶습니다. 이 경우 \N{greek:alpha}
을 어떻게 사용할 수 있습니까?
this question에 대한 디버깅을 수행하는 동안 나는 주어진 유니 코드 포인트에 대해 \N{}
에서 사용할 수있는 모든 값을 어떻게 찾습니까?특정 코드 포인트를 생성하기 위해 N {}에서 사용할 수있는 모든 값을 얻으려면 어떻게해야합니까?
예를 들어 U + 03B1 (GREEK SMALL LETTER ALPHA)의 모든 별칭을 알고 싶습니다. 이 경우 \N{greek:alpha}
을 어떻게 사용할 수 있습니까?
위의 사항을 확인하는 단일 목록은 없습니다. 예를 들어
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 가져 오기에
\N{}
의 바탕으로 , 다음 트릭을 할 것입니다 매개 변수는 대소 문자를 구분하지 않습니다.
use charnames qw();
의 인스턴스 (즉, 매개 변수없이 charnames.pm을로드하는 명령문)는 실제로 필요하지 않습니다.\N{}
이 나오기 전에 charnames.pm이로드되지 않으면 use charnames qw(:full :short);
을 사용하여 암시 적으로로드됩니다.U+
다음
U+
다음에 오는 숫자는 0을 가질 수 있습니다.:short
의 스크립트 이름은 대/소문자를 구분하지 않습니다.:short
이고 스크립트 문자 이름은 대소 문자를 구분하지 않지만 대문자를 하나 이상 포함해야합니다.use charnames qw(:loose);
을 사용하면 표시된 문자열을 추가로 변형 할 수 있습니다.이것을 유니 코드 :: UCD에 추가해야합니다. – ThisSuitIsBlackNot
@ThisSuitIsBlack 아닙니다. 아니요, 사용하는 것 외에는 UCD와 아무 관련이 없습니다. CPAN에 별도의 모듈로 배치 할 수는 있지만 비교 가능한 제품이 없기 때문에 매우 제한적입니다. 정규 표현식 패턴이 일치하는 모든 문자열을 생성하는 하위를 요청하는 것과 같습니다. 내가 게시 한 함수는'\ N {}'을 문서화하는 것 이상을 수행하지 않으며, 그럼에도 불구하고 실제의 [documentation] (http://search.cpan.org/perldoc)보다 긴 모든 주석으로 만 수행합니다. ? charnames)를'\ N {}'에 사용합니다. – ikegami
그냥 멋지다! 정확히 내가 무엇을 찾고 있었는지 – yulivee
관련 : [A 코드 포인트에 대한 모든 유니 코드 별칭을 얻기] (http://stackoverflow.com/questions/37663788/getting-all-unicode-aliases-for-a-codepoint) (처음으로 플래그 중복이지만, 유니 코드 별칭뿐만 아니라 해당 코드 포인트에 대해'\ N {}'에서 사용할 수있는 모든 것을 묻는 것처럼 들린다. – ThisSuitIsBlackNot
@ThisSuitIsBlackNot, Not Not. 'greek : alpha'는 Perl이 생성 한 것입니다. 그것은 UCD에서 (직접적으로) 아닙니다. – ikegami
@ikegami 네, 방금 투표를 취소했습니다. – ThisSuitIsBlackNot