Tôi đang gặp phải hành vi kỳ lạ khi sử dụng thư viện locale
với đầu vào unicode. Dưới đây là ví dụ làm việc tối thiểu:Ký tự Unicode không nằm trong phạm vi khi gọi 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]
Tôi đã thấy điều này trên Python 3.3, 3.4 và 3.5. Tôi không nhận được lỗi trên Python 2.7. Theo như tôi có thể thấy, đầu vào unicode của tôi nằm trong phạm vi unicode thích hợp, do đó, có vẻ như bằng cách nào đó nội bộ nào đó bên trong strxfrm
khi sử dụng 'en_US.UTF-8' đang di chuyển đầu vào ra khỏi phạm vi.
Tôi đang chạy Mac OS X và hành vi này có thể liên quan đến http://bugs.python.org/issue23195 ... nhưng tôi đã bị ấn tượng rằng lỗi này sẽ chỉ hiển thị dưới dạng kết quả không chính xác, chứ không phải ngoại lệ được nêu ra. Tôi không thể sao chép trên máy SLES 11 của tôi, và một số khác xác nhận rằng họ không thể sao chép trên Ubuntu, CentOS hoặc Windows. Nó có thể được hướng dẫn để nghe về hệ điều hành khác trong các ý kiến.
Ai đó có thể giải thích điều gì có thể xảy ra ở đây dưới mui xe?
Tôi không thể tạo lại trên Ubuntu. 'locale.strxfrm (x)' trả về ''\ x01 \ x01 \ x01 \ x01 Ւ'' trong miền địa phương' en_US.UTF-8'. – jfs
bạn có thể sử dụng ['icu.Collator.createInstance (icu.Locale ('en_US')). GetSortKey' thay thế] (http://stackoverflow.com/a/32178778/4279) – jfs
@JFSebastian Vâng, tôi đã sử dụng PyICU và xác nhận không có vấn đề ở đó. Tôi đã quan tâm nhiều hơn đến hành vi này trong mô-đun 'locale' stdlib và nếu đây là một số lỗi người dùng (tức là tôi đã làm điều gì đó sai) hoặc nếu có điều gì đó bất chính xảy ra hơn. – SethMMorton