Si verifica un comportamento strano quando si utilizza la libreria locale
con input Unicode. Di seguito è riportato un esempio di lavoro minimo:Caratteri Unicode non compresi nell'intervallo quando si chiama locale.strxfrm
>>> x = '\U0010fefd'
>>> ord(x)
1113853
>>> ord('\U0010fefd') == 0X10fefd
True
>>> ord(x) <= 0X10ffff
True
>>> import locale
>>> locale.strxfrm(x)
'\U0010fefd'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.strxfrm(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: character U+110000 is not in range [U+0000; U+10ffff]
Ho visto questo su Python 3.3, 3.4 e 3.5. Non ricevo un errore su Python 2.7.
Per quanto posso vedere, il mio ingresso Unicode è all'interno della gamma unicode appropriata, così sembra che in qualche modo qualcosa di interno al strxfrm
quando si utilizza il 'en_US.UTF-8' si sta muovendo l'ingresso fuori portata.
Sto eseguendo Mac OS X e questo comportamento potrebbe essere correlato a http://bugs.python.org/issue23195 ... ma avevo l'impressione che questo errore si manifestasse solo come risultati errati, non come un'eccezione sollevata. Non riesco a replicare sulla mia macchina SLES 11, altri confermano che non possono replicarsi su Ubuntu, Centos o Windows. Potrebbe essere istruttivo ascoltare altri OS nei commenti.
Qualcuno può spiegare cosa potrebbe accadere qui sotto il cofano?
Non riesco a riprodurlo su Ubuntu. 'locale.strxfrm (x)' restituisce ''\ x01 \ x01 \ x01 \ x01 Ւ'' nella locale' en_US.UTF-8'. – jfs
potresti usare ['icu.Collator.createInstance (icu.Locale ('en_US')). GetSortKey' invece] (http://stackoverflow.com/a/32178778/4279) – jfs
@JFSebastian Sì, ho usato PyICU e conferma che non ci sono problemi lì. Ero più preoccupato per questo comportamento nel modulo 'locale' di stdlib e se si trattava di una sorta di errore dell'utente (cioè ho fatto qualcosa di sbagliato) o se c'è qualcosa di più nefasto in corso. – SethMMorton