2010-11-12 8 views
16

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

+0

Search i zastąpić może, będziesz mieć pełną gamę specjalnych do zwykłych znaków chociaż. – soulseekah

Odpowiedz

36

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.

+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

Jestem trochę zdezorientowany: Próbowałem wydrukować unicodedata.normalize ('NFKD', u "ıöüç"), a wynik jest ponownie: ıöüç – Hellnar

+0

Wypróbuj inne prawidłowe wartości "NFC", "NFKC", "NFD" i "NFKD". – soulseekah

+2

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

5

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') 
1

Najprostszym sposobem znalazłem:

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