Ich habe ein Problem mit dem Sortieren von Listen mit Unicode-Kollatierung in Python 2.5.1 und 2.6.5 auf OSX, sowie auf Linux.Python sortiert Unicode nicht korrekt. Strcoll hilft nicht
import locale
locale.setlocale(locale.LC_ALL, 'pl_PL.UTF-8')
print [i for i in sorted([u'a', u'z', u'ą'], cmp=locale.strcoll)]
Welche gedruckt werden soll:
[u'a', u'ą', u'z']
Aber stattdessen druckt:
[u'a', u'z', u'ą']
es zusammenfassend - es sieht aus, als ob strcoll gebrochen war. Versucht es mit verschiedenen Arten von Variablen (zB nicht-Unicode-codierten Strings).
Was mache ich falsch?
Mit freundlichen Grüßen, Tomasz Kopczuk.
Was bedeutet 'locale.getlocale (LC_COLLATE)' Rückkehr nach Ihrer setlocaleQ Linie? – Amber
Das Modul 'locale' verwendet die Locale-API aus der C-Bibliothek. Wenn ein Fehler auftritt, muss es sich daher in der C-Bibliothek befinden. Ein äquivalenter Test mit der Ländereinstellung 'de_DE.UTF-8' und der Zeichenfolge' ä' anstelle von '_' funktioniert ordnungsgemäß. Selbst wenn ich das deutsche Gebietsschema mit "±" verwende, ist die Reihenfolge korrekt, also muss etwas mit der polnischen Gebietsschema-Implementierung in der C-Bibliothek nicht stimmen. Als Workaround können Sie die Zeichenkette mit 'unicodedata.normalize' in Normalisierungsform D umwandeln, dann sollte sogar die naive' strcmp'-Ordnung funktionieren. – Philipp
OK, das interessiert mich auch. Ich habe es mit 'pl_PL.UTF-8' und' de_DE.UTF-8' versucht und auch mit 'sort (key = locale.strxfrm)' anstelle von 'strcoll' auch auf OS X und im Moment bin ich dabei falsches Ergebnis Sting 'ä' mit de_DE.UTF8 hat bei mir nicht funktioniert. – chryss