Występuje dziwne zachowanie podczas korzystania z biblioteki locale
z wejściem Unicode. Poniżej znajduje się minimalny przykład roboczy:Znak Unicode spoza zakresu podczas wywoływania 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]
Widziałem to na Pythonie 3.3, 3.4 i 3.5. Nie dostaję błędu w Pythonie 2.7.
O ile widzę, moje wejście unicode jest w odpowiednim zakresie Unicode, więc wydaje się, że jakoś coś wewnętrznego do strxfrm
przy użyciu "en_US.UTF-8" przesuwa wejście poza zasięg.
Używam Mac OS X, a to zachowanie może być związane z http://bugs.python.org/issue23195 ... ale byłem pod wrażeniem, że ten błąd będzie manifestował się jako nieprawidłowe wyniki, a nie podniesiony wyjątek. Nie mogę zreplikować na moim komputerze SLES 11, a inni potwierdzają, że nie mogą replikować w systemie Ubuntu, Centos lub Windows. Może być pouczające słuchać o innych systemach operacyjnych w komentarzach.
Czy ktoś może wyjaśnić, co może się tu dziać pod maską?
Nie mogę tego odtworzyć na Ubuntu. 'locale.strxfrm (x)' zwraca ''\ x01 \ x01 \ x01 \ x01 Ւ'' w lokalizacji' en_US.UTF-8'. – jfs
można użyć ['icu.Collator.createInstance (icu.Locale ('en_US')). GetSortKey' zamiast] (http://stackoverflow.com/a/32178778/4279) – jfs
@JFSebastian Tak, użyłem PyICU i potwierdź, że nie ma problemu. Byłem bardziej zaniepokojony tym zachowaniem w module "locale" stdlib i jeśli był to jakiś błąd użytkownika (tzn. Zrobiłem coś złego) lub jeśli dzieje się coś bardziej niecnego. – SethMMorton