Wenn man in Python 2 mit Unicode-Strings arbeitet, kann der Vergleich zweier Strings manchmal unerwartet ausgehen. Zwei Strings können gleich aussehen, Python meldet aber das Gegenteil. Wie ist das möglich? Wie kann das deutsche Wort “Glück” nicht dasselbe sein wie “Glück”?
In Unicode gibt es zwei Arten, den deutschen Umlaut zu kodieren. Mehr dazu: https://en.wikipedia.org/wiki/Unicode_equivalence
Im Fall von “Glück” lässt sich der ü-Umlaut kodieren als
- vollständiges Zeichen
U+00fc - Zeichen “u” gefolgt von einem non-spacing mark bzw. Akzentzeichen, das für sich kein eigenes Zeichen ist, sondern das vorangehende Zeichen modifiziert/überlagert. Das wird als ASCII-“u” (
U+0075) gefolgt von"(U+0308) kodiert.
Code zum Umwandeln zwischen beiden:
>>> import unicodedata
>>> unicodedata.normalize("NFD", u"ü")
u'u\u0308'
>>> unicodedata.normalize("NFC", u"u\u0308")
u'\xfc'Behalte das im Kopf, wenn du in Python Strings vergleichst – und beachte, dass Python 2 und 3 sie nicht exakt gleich behandeln.