Witam odzyskać tekst oparty utf8 danych ze źródła zagranicznego, który zawiera znaki specjalne, takie jak u"ıöüç"
natomiast chcę normalizować je na angielski, takich jak "ıöüç"
->"iouc"
. Jaki byłby najlepszy sposób, aby to osiągnąć?Python i charakter normalizacja
Odpowiedz
Polecam używanie Unidecode module:
>>> from unidecode import unidecode
>>> unidecode(u'ıöüç')
'iouc'
Uwaga jak karmisz to ciąg Unicode i wyprowadza ciąg bajtów. Wyjście ma gwarantowaną wartość ASCII.
Nice one +1 http://pypi.python.org/pypi/Unidecode/0.04.1 – soulseekah
import unicodedata
unicodedata.normalize()
Jestem trochę zdezorientowany: Próbowałem wydrukować unicodedata.normalize ('NFKD', u "ıöüç"), a wynik jest ponownie: ıöüç – Hellnar
Wypróbuj inne prawidłowe wartości "NFC", "NFKC", "NFD" i "NFKD". – soulseekah
Jestem prawie pewien, że jest to inna operacja niż ta, której szuka osoba pytająca. Ale tak, to normalizacja unicode. To, o co prosił, nie jest zwykle nazywane takim. – drxzcl
Wszystko zależy od tego, jak daleko zajdzie potrzeba transliteracji wyniku. Jeśli chcesz przekonwertować wszystko do ASCII (αβγ
do abg
), to jest to droga, którą należy przejść.
Jeśli chcesz tylko usunąć akcenty z akcentowanych liter, a następnie można spróbować rozkładając swój ciąg formularz normalizacja NFKD (to konwertuje akcentowane litery á
do zwykłego listu a
następnie U+0301 COMBINING ACUTE ACCENT
), a następnie odrzucając akcenty (które należą do Unicode character classMn
- "Oznacz, bez odstępu").
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')
Najprostszym sposobem znalazłem:
unicodedata.normalize('NFKD', s).encode("ascii", "ignore")
Search i zastąpić może, będziesz mieć pełną gamę specjalnych do zwykłych znaków chociaż. – soulseekah