2025/06/21(土)PerlでUnicodeの文字集合から特定の部分文字集合を16進数形式で抜き出すやつ
まれによく必要になるのですが、必要になった頃には書き方が思い出せないのでメモ。出力形式などは簡単にカスタマイズできます。
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use utf8;
my $state = 0;
for (0x0000 .. 0x10FFFF)
{
$_ = chr;
my $codepoint = sprintf("%04X", ord);
if (/\p{Han}/)
{
print $codepoint if $state == 0;
$state++;
}
else
{
if ($state > 1)
{
say "\\t$codepoint";
}
elsif ($state == 1)
{
say "\n$codepoint";
}
$state = 0;
}
}
出力:
2E80\t2E9A
2E9B\t2EF4
2F00\t2FD6
3005
3006
3007
3008
3021\t302A
3038\t303C
3400\t4DB6
4E00\t9FD6
F900\tFA6E
FA70\tFADA
20000\t2A6D7
2A700\t2B735
2B740\t2B81E
2B820\t2CEA2
2F800\t2FA1E