Здравствуйте я получить текст на основе utf8 данных из иностранного источника, который содержит специальные символы, такие как u"ıöüç"
в то время как я хочу, чтобы нормализовать их на английский язык, такие как "ıöüç"
->"iouc"
. Какой был бы лучший способ достичь этого?Python и характер нормализации
ответ
Я рекомендую использовать Unidecode module:
>>> from unidecode import unidecode
>>> unidecode(u'ıöüç')
'iouc'
Обратите внимание, как вы кормите его строку Юникода и выводит строку байтов. Выход гарантированно будет ASCII.
Nice one +1 http://pypi.python.org/pypi/Unidecode/0.04.1 – soulseekah
import unicodedata
unicodedata.normalize()
I am abit confused: Я пробовал print unicodedata.normalize ('NFKD', u "ıöüç"), и результат снова: ıöüç – Hellnar
Попробуйте другие допустимые значения «NFC», «NFKC», «NFD» и 'NFKD. – soulseekah
Я вполне уверен, что это другая операция, чем то, что ищет искатель. Но да, это нормализация юникода. То, что он спрашивает, обычно не упоминается как таковое. – drxzcl
Все зависит от того, как далеко вы хотите транслировать результат. Если вы хотите полностью конвертировать все в 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')
Самый простой способ я нашел:
unicodedata.normalize('NFKD', s).encode("ascii", "ignore")
Поиск и замена может быть, вы будете иметь полный набор специальный для обычных символов, хотя. – soulseekah