2008年1月14日月曜日

pythonと文字幅(Unicodeの正規化)

pythonスレをみてて気になったので調べた結果。

入力フォームで全角のみを許可したいという話なので、全角(Full-width)かどうかの判定をunicodedataでやれば楽ができそうと思った(853)。
ただ、入力がUnicodeの場合は分解されている可能性があるので、正規合成しなくても大丈夫か気になった。

Python 2.5.1 (r251:54863, Nov 19 2007, 17:32:14)
[GCC 4.2.2 (Gentoo 4.2.2 p1.0)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import unicodedata
>>> for uc in unicodedata.normalize('NFD', u'ぱいそん'):
...  uc, unicodedata.east_asian_width(uc)
...
(u'\u306f', 'W')
(u'\u309a', 'W')
(u'\u3044', 'W')
(u'\u305d', 'W')
(u'\u3093', 'W')
>>>

ということで、特に問題ないのかな?
まあ、合成した方がわかりやすい気がするけど。


unicodedataとicuは出来ることがかぶってる~って書こうと思ったら、UAX #11: East Asian Widthを見つけた。PyICUは開発中で、現状ではuchar/UCharacterに該当するものが無いから、この件に関してはunicodedataを使うしかないけど。


正規化は便利だし、なんかおもしろい。
入力文字種を制限するんじゃなくて、入力を正規化して、確認画面で正しいかどうかをユーザに判断してもらうのもありなんじゃないかな。
まあその場合、NFC+Full-Widthに統一かな。NFKCだとHalf→Fullまで出来るけど、複数文字を1文字にしたのがばらされてしまう。それが問題にならなければ楽。

>>> print unicodedata.normalize(u'NFKC', u'㍊㌶㍻㎡パイソンぱいそん')
ミリバールヘクタール平成m2パイソンぱいそん



0 件のコメント:

コメントを投稿