2012-05-16

今年のゴールデンウィークはどこに行くともなくて、家や近所で本を読んだりコード書いたりしてた。

私用でいろいろと使っている Python のモジュールを整理して公開したいのだけど、その整理がどうもうまくまとまらない。仮名とか漢字とかを扱うデータベース的なものが多いんだけど、たいてい Unicode 文字列と真面目に取り組まないといけないことになる(とくに JIS X 0213:2004 以降に対応しようとすると)。で、そのために unicode オブジェクトを適切に分割するとか数え上げるとかするようなサブモジュールを作ることになる。とりあえずその部分だけ公開しようとしたのが、codepoint.py です。

でもこれだけだと物足りないこともあるね。たとえば JIS X 0213 では半濁点のついたカ行の仮名や小書きの「プ」などが追加されてるんだけど(主にアイヌ語の表記のためだと思う)、これらは Unicode では単独のコードポイントには割り振られていなくて、「仮名文字、U+309A」という、ふたつのコードポイントの組み合わせで表すことになっている(それでこれまでの JIS では保たれていた Unicode とのコードポイントにおける一対一の対応関係というのが崩れたと非難されたりもした)。こうした文字を含む文字列を列挙 (iterate) するときには、コードポイント単位での分割では不十分である。

Unicode では最小の区分単位であるコードポイントの上位に、「利用者が一文字と認識している区切り」にほぼ等しいものとして、grapheme cluster という区分が定義されている。上記のような文字列はこのグラフィム・クラスタ単位で分割して処理しなければいけないわけです。ほんとは。

で、そういうユーティリティ的なものをどうまとめるかが悩みどころで、本来の目的のモジュールのサブモジュールに入れてしまえば依存関係がなくなるから楽なんだけど、グラフィム・クラスタ云々までやるとけっこうコードが大きくなって、それだけでモジュールにしたほうがよさげになる。じゃあ独立させればとなるんだけど、独立させるとその上の単語区切りとか禁則とかのことも扱うモジュールであることを期待されるような気がして話がでかくなる(本来のモジュールのほうに手が回らなくなりそう)。あーどうしよう、というのをもう数年悩んでる。数年悩んでたら unicodedata モジュールが標準で対応してきてるんじゃないのと思ったけどまだ対応してこない。

でもここに書いてたらちょっとやる気になってきたよ。やるかも。ていうか前にここで出したことあるっけ? まあいいか。ツイッターだと字数制限あるしこういう悩みは書けなかったんだよねー。