カテゴリー
Uncategorized

[Python] [unicode] unicodedata だけで半角->全角の変換ができるか

# -*- 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'

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です