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 テキスト処理のさまざまな場面で役立ちそうです。