2010-11-12 11 views
16

Hallo I textbasierte UTF8-Daten aus einer fremden Quelle abzurufen, die Sonderzeichen wie u"ıöüç" enthält, während ich sie auf Englisch wie "ıöüç" normalisieren will ->"iouc". Was wäre der beste Weg, dies zu erreichen?Python und Zeichennormalisierung

+0

Suchen und Ersetzen vielleicht, werden Sie jedoch eine vollständige Palette von speziellen zu normalen Zeichen haben müssen. – soulseekah

Antwort

36

Ich empfehle, mit Unidecode module:

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

Hinweis, wie Sie es eine Unicode-String füttern und es gibt ein Byte-String. Die Ausgabe ist garantiert 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

Ich bin ein wenig verwirrt: Ich habe versucht print unicodedata.normalize ('NFKD', u "ıöüç") und der Ausgang ist wieder: ıöüç – Hellnar

+0

Versuchen Sie die anderen gültigen Werte 'NFC', 'NFKC', 'NFD' und "NFKD". – soulseekah

+2

Ich bin ziemlich sicher, das ist eine andere Operation als das, was der Fragesteller sucht. Aber ja, das ist Unicode-Normalisierung. Was er fragt, wird normalerweise nicht als solches bezeichnet. – drxzcl

5

Es hängt alles davon ab, wie weit Sie das Ergebnis transliterieren möchten. Wenn Sie alles vollständig in ASCII konvertieren möchten (αβγ zu abg), dann ist unidecode der Weg zu gehen.

Wenn Sie nur aus Buchstaben mit Akzenten entfernen Akzente wollen, dann können Sie versuchen, Ihre Zeichenfolge mit Normalisierungsform NFKD Zersetzen (dies setzt den Akzent Brief á zu einem einfachen Brief a von U+0301 COMBINING ACUTE ACCENT gefolgt) und dann die Akzente zu verwerfen (die gehören an die Unicode character classMn - "Mark, nonspacing").

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

Die einfachste Art, wie ich gefunden:

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