Ответ 1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unicodedata
text = u'Cześć'
print unicodedata.normalize('NFD', text).encode('ascii', 'ignore')
Есть ли какой-либо lib, который может заменить специальные символы на эквиваленты ASCII, например:
"Cześć"
в
"Czesc"
Я могу, конечно, создать карту:
{'ś':'s', 'ć': 'c'}
и используйте некоторую функцию замены. Но я не хочу жестко кодировать все эквиваленты в свою программу, если есть какая-то функция, которая уже делает это.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unicodedata
text = u'Cześć'
print unicodedata.normalize('NFD', text).encode('ascii', 'ignore')
Вы можете получить большую часть своей работы:
import unicodedata
def strip_accents(text):
return ''.join(c for c in unicodedata.normalize('NFKD', text) if unicodedata.category(c) != 'Mn')
К сожалению, существуют латинские буквы с акцентом, которые нельзя разложить на букву ASCII + сочетание меток. Вам придется обрабатывать их вручную. К ним относятся:
Попробуйте trans. Выглядит очень многообещающе. Поддерживает польский.
Я сделал это следующим образом:
POLISH_CHARACTERS = {
50309:'a',50311:'c',50329:'e',50562:'l',50564:'n',50099:'o',50587:'s',50618:'z',50620:'z',
50308:'A',50310:'C',50328:'E',50561:'L',50563:'N',50067:'O',50586:'S',50617:'Z',50619:'Z',}
def encodePL(text):
nrmtxt = unicodedata.normalize('NFC',text)
i = 0
ret_str = []
while i < len(nrmtxt):
if ord(text[i])>128: # non ASCII character
fbyte = ord(text[i])
sbyte = ord(text[i+1])
lkey = (fbyte << 8) + sbyte
ret_str.append(POLISH_CHARACTERS.get(lkey))
i = i+1
else: # pure ASCII character
ret_str.append(text[i])
i = i+1
return ''.join(ret_str)
при выполнении:
encodePL(u'ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ')
он будет производить вывод следующим образом:
u'acelnoszz ACELNOSZZ'
Это отлично работает для меня -; D
Unicodedata.normalize трюк лучше всего описать как half-assci. Вот надежный подход, который включает карту для букв без декомпозиции. Обратите внимание на дополнительные записи в комментариях.