@: __deets__: Es ist grausam, mit den Zeichenfolgen außerhalb des ASCII zu experimentieren.
Ich habe mir mal ein kleine Beispiel geschrieben. Ein paar Anmerkungen habe ich direkt als Kommentar im Quelltext geschrieben und weiter unten habe ich meine Befürchtung geäußert.
Code: Alles auswählen
from unicodedata import name, normalize
a = u"Ä"
print "Name of NFC", [name(c) for c in normalize("NFC", a)]
print "Name of NFD", [name(c) for c in normalize("NFD", a)]
normal = normalize("NFC", a).encode("unicode_escape")
print type(normal)
print "NFC with unicode_escape", normal
print "NFC with utf-8", normal.encode("utf-8") # Hier wollte ich wieder zurück wandeln, damit ich mein 'Ä' wieder bekomme.
for norm in ('NFC', 'NFKC', 'NFD','NFKD'):
b = normalize(norm, a).encode("unicode_escape")
print b, len(b)
Ausgabe:
Name of NFC ['LATIN CAPITAL LETTER A WITH DIAERESIS']
Name of NFD ['LATIN CAPITAL LETTER A', 'COMBINING DIAERESIS']
<type 'str'>
NFC with unicode_escape \xc4
NFC with utf-8 \xc4 # <-- Leider ist es kein 'Ä' geworden, wie es ursprünglich war.
\xc4 4
\xc4 4
A\u0308 7
A\u0308 7
Die For-Schleife zeigt mir, dass NFC' und 'NFKC' im Zuge der Normalisierung 4 Längen haben und das 'NFD und 'NFKD' 7 längen. Und da ich mich frage, welche von den Funktionen nun geeignet sind, bin ich hierauf gestoßen:
When to use Unicode Normalization Forms NFC and NFD?. Der Fragensteller hatte wohl auch die Qual der Wahl. Aber was mich sehr beunruhigt, ist, dass der Antworter namens
Jukka K. Korpela folgendes erwähnt:
[...] normalization may destroy essential information in the data.. Und er führt ein ausführliches Beispiel an. Da ich mit der Datenbank arbeite, ist es für mich wichtig, dass keine Informationen zerstört werden.