JIS 漢字コードの第 1 水準漢字以外を検出します。
Perl が一番楽そうだったので Perl 使いました。
何がしたいか
$ echo "perl" | hoge false $ echo "あいうえお。" | hoge false $ echo "漢字 | hoge false $ echo "弌腕。" | hoge # 第 2 水準漢字が入っている true
第 1 水準漢字
第 1 水準漢字は亜から腕までの範囲を指します。
ただ、亜-腕のような正規表現でチェックするだけでは不十分です。
この記事に詳細は書いてあり、非常に参考になりました。
ということで範囲を調べる必要があります。
コード表を参照して、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 はここ
おわり。