パスワードを忘れた? アカウント作成
14281660 journal
映画

route127の日記: 漢数字ソート(Perl+Unicode::Unihan)

日記 by route127

イップマン4に合わせたのか、ドニーイェン出演の2017年製作香港ノワール映画、追龍が上映されていて、広東語への興味がぶり返してきた。
そこでUnicodeに広東語で使われる文字がどの程度含まれているのかを調べようとしていたところ、Unihanに広東語ピンインが含まれていることを知り、Unihanの資料を見ていると広東語ピンインを収録したCantoneseプロパティ以外にも思いのほかいろいろ定義されていて、この中のNumeric系のプロパティを使えば漢数字のソートができるのではないかと思い試していた。
(ちなみに以前Perl 5.30の正規表現の特性値指定ワイルドカードで漢数字にマッチさせようとして失敗している。

適当な並びの漢数字の配列を作成し数値比較(<=>)でソートをかけても順番は変わらない。

perl -e "print sort{$a <=> $b}qw(二 七 八 三 一 五 四 六 十 九);"

#二七八三一五四六十九

文字列比較(cmp)でソートすると順番は変わる。

perl -e "print sort{$a cmp $b}qw(二 七 八 三 一 五 四 六 十 九);"

#一九五三四七十二八六

しかしこれは一部がコードポイント順になるのみである。

perl -MEncode -e "print join qq/ /, map{sprintf qq/%X/, unpack('U*', decode('cp932', $_))}sort{$a cmp $b}qw(二 七 八 三 一 五 四 六 十 九);"

#4E00 4E5D 4E94 4E09 56DB 4E03 5341 4E8C 516B 516D

IMEを入れて4E00[F5]で「一」になることを確かめられる。

ここでUnicode::Unihanを使い、PrimaryNumericプロパティをキーにしてソートすると意図した順番で出力されるようになる。

perl -MEncode -MUnicode::Unihan -e "$uh=Unicode::Unihan->new();print sort{$uh->PrimaryNumeric(decode('cp932', $a)) <=> $uh->PrimaryNumeric(decode('cp932', $b))}qw(二 七 八 三 一 五 四 六 十 九);"

#一二三四五六七八九十

UTF-8環境ならdecodeは不要なはず。

また壱弐参肆伍陸のような大字はPrimaryNumericではなくAccountingNumeric値を持っている。

perl -MUnicode::Unihan -MEncode -e "$uh=Unicode::Unihan->new();print join qq/ /, map{$uh->AccountingNumeric(decode('cp932', $_))}qw(壱 弐 参 肆 伍 陸 佰 仟 阡);"

#1 2 3 4 5 6 100 1000 1000

Numeric系のプロパティには他にOtherNumericがあるが、どの漢字がこのプロパティ値を持つのか見当がつかなかったので適当にU+4E00~U+9EFFの間でこの値を持つ漢字を抽出してみた。

perl -MUnicode::Unihan -MEncode -e "$uh=Unicode::Unihan->new();map{printf(qq/%X\t%s\t%d\n/, $_->[1], encode('cp932', $_->[0]), $uh->OtherNumeric($_->[0]))}grep{$uh->OtherNumeric($_->[0])}map{[pack('U*', $_), $_]}0x4e00..0x9eff;"

コードポイント 漢字 OtherNumeric値
----------------------------------------
4E96 亖 4
4EC0 什 10
4EE8 仨 3
5169 兩 2
5344 卄 20
5345 卅 30
534C 卌 40
53C4 叄 3
5E7A 幺 1
5EFE 廾 9
5EFF 廿 20

そんなわけで香港ノワールが結果的にUnicodeについての知識を深める結果となったのだが、肝心の広東語の方はピンインを出力することはできたが何か雰囲気が違う。

perl -MEncode -MUnicode::Unihan -e "$uh=Unicode::Unihan->new();print join qq/\n/, $uh->Cantonese(decode('cp932', '葉問'))"

jip6 sip3
man6

どうやらイェール式(Yale)でもニューエクスプレス広東語で採用されている千鳥式でもなく1993年制定の粤語ピンイン(Jyutping)らしい。

日本語の音読みや

perl -MEncode -MUnicode::Unihan -e "$uh=Unicode::Unihan->new();print join qq/\n/, $uh->JapaneseOn(decode('cp932', '葉問'))"

YOU SHOU
MON BUN

北京語の発音

perl -MEncode -MUnicode::Unihan -e "$uh=Unicode::Unihan->new();print join qq/\n/, $uh->Mandarin(decode('cp932', '葉問'))"

YE4 XIE2 SHE4
WEN4

と比べると「葉」に関しては頭子音が広東語、北京語、日本語共に似通った音のように思えるが、「問」に関しては日粤と北京語の間には隔たりが感じられる。
ここで朝鮮音をみると、日粤と北京語の中間っぽいMもWも入った表記になってるのがなんか面白い。

perl -MEncode -MUnicode::Unihan -e "$uh=Unicode::Unihan->new();print join qq/\n/, $uh->Korean(decode('cp932', '葉問'))"

YEP SEP
MWUN

他にもベトナム音なども収録されているが、発音記号等あってcp932のコンソールで見るには向かなそう。

追龍II(2019)は日本公開されるんだろうか。

typodupeerror

私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson

読み込み中...