2014年05月05日

Pythonのunicodedataを使ってみる

unicodedataはUnicode正規化ができたり、少し手を入れれば簡易なUnicodeBlock判定ができたりする。

とりあえず基本的なコード。

# Unicodeバージョンの確認
print( unicodedata.unidata_version )
  #=> 6.3.0

# Unicode正規化
print( unicodedata.normalize("NFKC", "アイウエオABC") )
  #=> アイウエオABC

# 汎用カテゴリ(http://www.unicode.org/reports/tr44/#General_Category_Values)
print( unicodedata.category("A") )
  #=> Lu
print( unicodedata.category("b") )
  #=> Ll
print( unicodedata.category("1") )
  #=> Nd
print( unicodedata.category("\t") )
  #=> Cc
print( unicodedata.category("ア") )
  #=> Lo
print( unicodedata.category("、") )
  #=> Po

# 名称の取得
print( unicodedata.name("A") )
  #=> LATIN CAPITAL LETTER A
print( unicodedata.name("あ") )
  #=> HIRAGANA LETTER A
print( unicodedata.name("イ") )
  #=> KATAKANA LETTER I
print( unicodedata.name("山") )
  #=> CJK UNIFIED IDEOGRAPH-5DDD
print( unicodedata.name("〒") )
  #=> POSTAL MARK

Unicode Blockの取得はできないらしい。下記に取得用のサンプルコードがあった。

http://stackoverflow.com/questions/243831/unicode-block-of-a-character-in-python?rq=1

平仮名、片仮名、漢字を取る場合は下記のような簡易コードで判定できなくもない。

def isKatakana(ch):
  return unicodedata.name(ch).startswith("KATAKANA LETTER")

def isHiragana(ch):
  return unicodedata.name(ch).startswith("HIRAGANA LETTER")

def isKanji(ch):
  return unicodedata.name(ch).startswith("CJK UNIFIED")

print( isHiragana( "あ" ) )
  #=> True
print( isKatakana( "あ" ) )
  #=> False

漢字はCJK UNIFIEDという指定だとちょっと心もとない。真面目にやるならCJK Radicals Supplement, Kangxi radical, CJK Strokes, CJK Compatibility Ideographsなどいろいろあるので、その辺も考えないといけない。