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
Antwort
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.
Nice one +1 http://pypi.python.org/pypi/Unidecode/0.04.1 – soulseekah
import unicodedata
unicodedata.normalize()
Ich bin ein wenig verwirrt: Ich habe versucht print unicodedata.normalize ('NFKD', u "ıöüç") und der Ausgang ist wieder: ıöüç – Hellnar
Versuchen Sie die anderen gültigen Werte 'NFC', 'NFKC', 'NFD' und "NFKD". – soulseekah
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
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')
Die einfachste Art, wie ich gefunden:
unicodedata.normalize('NFKD', s).encode("ascii", "ignore")
Suchen und Ersetzen vielleicht, werden Sie jedoch eine vollständige Palette von speziellen zu normalen Zeichen haben müssen. – soulseekah