2007年12月23日

Python の unicodedata モジュール

Unicode のちょっとしたテキスト処理をしようと思い、 Python の unicodedata モジュールを使ってみました。これは非常に便利です。

 

unicodedata は Python に標準で付属するため、別途のインストールは不要です。次のようなことができます。

文字の名前を取得する

文字の名前を取得することができます。Unicode の文字にはすべて一意の名前がつけられています。ソースコード内で Unicode のコードポイントを使うときは U+20AC (EURO SIGN) などとコメントをつけておくと便利でしょう。

>>> unicodedata.name(u'A')
'LATIN CAPITAL LETTER A'
>>> unicodedata.name(u'あ')
'HIRAGANA LETTER A'

文字の名前から文字を取得する

逆に名前から文字を取得することもできます。

>>> unicodedata.lookup('LATIN CAPITAL LETTER A')
u'A'
>>> unicodedata.lookup('HIRAGANA LETTER A')
u'\u3042'

文字の幅を調べる

文字に対し文字の幅が半角か全角か調べることができます。Unix の端末上で動くツールを作るときに重宝しそうです。

>>> unicodedata.east_asian_width(u'A')  # 全角のA
'F'
>>>  unicodedata.east_asian_width(u'ア')  # 半角のア
'H'
>>> unicodedata.east_asian_width(u'あ')
'W'
>>> unicodedata.east_asian_width(u'A')  # ASCII のA
'Na'
>>> unicodedata.east_asian_width(u'Ⅳ')
'A'
>>> unicodedata.east_asian_width(u'\u0E20')  # タイ語の文字
'N'

east_asian_width() の返り値は UAX #11: East Asian Width の定義に対応しています。

  • F - East Asian Full-width
  • H - East Asian Half-width
  • W - East Asian Wide
  • Na - East Asian Narrow (Na)
  • A - East Asian Ambiguous (A)
  • N - Not East Asian

文字の数値を調べる

文字が数字の場合、その数値を調べることができます。decimal ⊂ digit ⊂ numeric の順に集合が大きくなります。

>>> unicodedata.decimal(u'3')  # decimal
3
>>> unicodedata.digit(u'\u2462')  # ③ digit
3
>>> unicodedata.numeric(u'\u215b')  # 1/8 numeric
0.125
>>> unicodedata.numeric(u'Ⅳ')  # これも numeric
4.0
>>> unicodedata.numeric(u'三', False)  # 漢数字はない
False

文字の種類を調べる

小文字、大文字などの文字の種類を調べることができます。詳しい分類は Unicode Character Database のページに解説されています。

>>> unicodedata.category(u'a')  # Letter, Lowercase
'Ll'
>>> unicodedata.category(u'A')  # Letter, Uppercase
'Lu'
>>> unicodedata.category(u'あ')  # Letter, Other
'Lo'

その他

この他にも unicodedata モジュールはテキストの正規化や合字 (combining character) のクラスの取得などといったことができます。詳しくはunicodedata モジュールのマニュアルを参照してください。

htmlentitydefs モジュール

htmlentitydefs は unicodedata とは別のモジュールですが、合わせて使うと便利なので、ついでに紹介します。このモジュールは HTML の実体文字参照 (character entity reference) に関する3つの辞書を提供しています。entitydefs は ISO-8859-1 の文字を返すので Unicode 処理では次の2つを使います。

# コードポイントから名前を取得
>>> htmlentitydefs.codepoint2name[0x20ac]
'euro'

# 名前からコードポイントへ
>>> '%x' % htmlentitydefs.name2codepoint['euro']
'20ac'

まとめ

Python の unicodedata および htmlelementdefs モジュールについて紹介しました。どちらも Unicode テキスト処理のさまざまな場面で役立ちそうです。