CORDEA blog

Android applications engineer

第 1 水準以外の漢字を検出する

JIS 漢字コードの第 1 水準漢字以外を検出します。
Perl が一番楽そうだったので Perl 使いました。

何がしたいか

$ echo "perl" | hoge
false
$ echo "あいうえお。" | hoge
false
$ echo "漢字 | hoge
false
$ echo "弌腕。" | hoge # 第 2 水準漢字が入っている
true

第 1 水準漢字

第 1 水準漢字は亜から腕までの範囲を指します。
ただ、亜-腕のような正規表現でチェックするだけでは不十分です。

y0m0r.hateblo.jp

この記事に詳細は書いてあり、非常に参考になりました。
ということで範囲を調べる必要があります。

コード表を参照して、Shift JIS における文字コードの範囲を調べます。
亜だったら 889F, 腕は 9872 です。

一通り調べると、

  • 889F - 88FC
  • 8940 - 97FC
  • 9840 - 9872

の範囲であることが分かります。
これを正規表現に起こすとこんな感じ

\x88[\x9F-\xFC]|[\x89-\x97][\x40-\xFC]|\x98[\x40-\x72]

第 1 水準漢字以外の漢字

第 1 水準漢字の検出はできましたが、実際に欲しいものは違います。

漢字の検出は \p{Han} で可能です。
なので、\p{Han} で取得した漢字を先程の正規表現に当てて、引っかからないものが第 1 水準漢字以外としました。

ただ、\p{Han} だと句読点なども含まれます。\p{Script=Han} にすると句読点は除くことができますが、々などは入ってきます。
なので、先程の正規表現で記号も見ることにします。コード表によると記号は

  • 8140-81AC

あたりです (実際はもうちょっとあります、サボりました)

これを付け加えて

\x81[\x40-\xAC]|\x88[\x9F-\xFC]|[\x89-\x97][\x40-\xFC]|\x98[\x40-\x72]

これでふんわり記号 + 第 1 水準漢字です。ちゃんと見るなら 1 区から 8 区までの文字コードを追加すれば良いと思います。
この正規表現で引っかからない場合は第 2 水準漢字とか、そのへんです。

あと、第 1 水準漢字のところでは Shift JIS になっている必要があるので

encode("sjis", $hans);

こういう処理が必要です。

Repository はここ

github.com

おわり。