2010-11-12 5 views
16

Здравствуйте я получить текст на основе utf8 данных из иностранного источника, который содержит специальные символы, такие как u"ıöüç" в то время как я хочу, чтобы нормализовать их на английский язык, такие как "ıöüç" ->"iouc". Какой был бы лучший способ достичь этого?Python и характер нормализации

+0

Поиск и замена может быть, вы будете иметь полный набор специальный для обычных символов, хотя. – soulseekah

ответ

36

Я рекомендую использовать Unidecode module:

>>> from unidecode import unidecode 
>>> unidecode(u'ıöüç') 
'iouc' 

Обратите внимание, как вы кормите его строку Юникода и выводит строку байтов. Выход гарантированно будет ASCII.

+3

Nice one +1 http://pypi.python.org/pypi/Unidecode/0.04.1 – soulseekah

0
import unicodedata 
unicodedata.normalize() 

http://docs.python.org/library/unicodedata.html

+0

I am abit confused: Я пробовал print unicodedata.normalize ('NFKD', u "ıöüç"), и результат снова: ıöüç – Hellnar

+0

Попробуйте другие допустимые значения «NFC», «NFKC», «NFD» и 'NFKD. – soulseekah

+2

Я вполне уверен, что это другая операция, чем то, что ищет искатель. Но да, это нормализация юникода. То, что он спрашивает, обычно не упоминается как таковое. – drxzcl

5

Все зависит от того, как далеко вы хотите транслировать результат. Если вы хотите полностью конвертировать все в ASCII (αβγ - abg), то unidecode - это путь.

Если вы просто хотите удалить акценты с акцентированных букв, то вы можете попробовать разлагая вашу строку, используя форму нормализации NFKD (это преобразует акцентированное письмо á в простое письмо a с последующим U+0301 COMBINING ACUTE ACCENT), а затем отбрасывая акценты (которые принадлежат до Unicode character classMn - «Отметка, несанкционированный доступ»).

import unicodedata 

def remove_nonspacing_marks(s): 
    "Decompose the unicode string s and remove non-spacing marks." 
    return ''.join(c for c in unicodedata.normalize('NFKD', s) 
        if unicodedata.category(c) != 'Mn') 
1

Самый простой способ я нашел:

unicodedata.normalize('NFKD', s).encode("ascii", "ignore")