Ho un problema con gli elenchi di ordinamento utilizzando regole di confronto unicode in Python 2.5.1 e 2.6.5 su OSX, così come su Linux.Python non ordina correttamente unicode. Strcoll non aiuta
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)]
Che dovrebbe stampare:
[u'a', u'ą', u'z']
Ma invece ne emette:
[u'a', u'z', u'ą']
Riassumendo in su - è come se strcoll era rotto. Ho provato con vari tipi di variabili (es .: stringhe codificate non-unicode).
Cosa faccio di sbagliato?
Cordiali saluti, Tomasz Kopczuk.
Cosa significa 'locale.getlocale (LC_COLLATE)' ritorno dopo la vostra linea setlocale? – Amber
Il modulo 'locale' usa l'API locale dalla libreria C, quindi se c'è un errore deve essere nella libreria C. Un test equivalente con le impostazioni locali 'de_DE.UTF-8' e stringa' ä' invece di '' funziona correttamente. Anche se utilizzo le impostazioni locali tedesche con "±", l'ordine è corretto, quindi è necessario che ci sia qualcosa di sbagliato nell'implementazione della lingua polacca nella libreria C. Come soluzione alternativa, è possibile convertire la stringa in forma di normalizzazione D usando 'unicodedata.normalize', quindi anche l'ingenuo ordinamento' strcmp' dovrebbe funzionare. – Philipp
OK, sono interessato anche a questo. Ho provato con 'pl_PL.UTF-8' e' de_DE.UTF-8', e anche con 'sort (chiave = locale.strxfrm)' invece di usare 'strcoll' anche su OS X e per il momento sto ottenendo il tuo risultato errato. Sting 'ä' con de_DE.UTF8 non ha funzionato per me. – chryss