# -*- coding: utf-8 -*- """ Unicode Standard Annex #11 East Asian Width: http://www.unicode.org/reports/tr11/tr11-14.html """ import unicodedata def convert(s, errors=''): assert isinstance(s, unicode) result = [] for c in s: #unicodedata.east_asian_width(c) == 'H' name = unicodedata.name(c, '') if name.startswith('HALFWIDTH '): try: c = unicodedata.lookup(name[10:]) except LookupError: print name if errors != 'ignore': raise result.append(c) return ''.join(result) if __name__ == '__main__': s = ''' アイウエオ ァィゥェォ カキクケコ サシスセソ タチツテト ナニヌネノ ハヒフヘホ マミムメモ ヤ ユ ヨ ャ ュ ョ ラリルレロ ワ ヲ ン 、。゙゚「」・ー ''' print convert(s.decode('utf_8'), 'ignore')
を実行した結果↓
HALFWIDTH KATAKANA VOICED SOUND MARK HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK アイウエオ ァィゥェォ カキクケコ サシスセソ タチツテト ナニヌネノ ハヒフヘホ マミムメモ ヤ ユ ヨ ャ ュ ョ ラリルレロ ワ ヲ ン 、。゙゚「」・ー
変換できなかったのは↓
>>> unicodedata.name('゛'.decode('mbcs')) 'KATAKANA-HIRAGANA VOICED SOUND MARK' >>> unicodedata.name('゜'.decode('mbcs')) 'KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK' >>> unicodedata.name('゙'.decode('mbcs')) 'HALFWIDTH KATAKANA VOICED SOUND MARK' >>> unicodedata.name('゚'.decode('mbcs')) 'HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK'