【发布时间】:2010-08-05 08:25:52
【问题描述】:
我在 OSX 以及 Linux 上的 Python 2.5.1 和 2.6.5 中使用 unicode 排序规则对列表进行排序时遇到问题。
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)]
应该打印的内容:
[u'a', u'ą', u'z']
而是打印出来:
[u'a', u'z', u'ą']
总结一下 - 看起来 strcoll 好像坏了。尝试了各种类型的变量(例如非 unicode 编码的字符串)。
我做错了什么?
最好的问候, 托马斯·科普祖克。
【问题讨论】:
-
locale.getlocale(LC_COLLATE)在您的 setlocale 行之后返回什么? -
locale模块使用 C 库中的语言环境 API,因此如果出现错误,则必须在 C 库中。使用语言环境de_DE.UTF-8和字符串ä而不是ą的等效测试可以正常工作。即使我使用带有ą的德语语言环境,顺序也是正确的,因此C 库中的波兰语言环境实现一定有问题。作为一种解决方法,您可以使用unicodedata.normalize将字符串转换为规范化形式 D,然后即使是幼稚的strcmp排序也应该可以工作。 -
好的,我也对这个感兴趣。我尝试使用
pl_PL.UTF-8和de_DE.UTF-8,以及sort(key=locale.strxfrm),而不是在OS X 上使用strcoll,目前得到的结果不正确。用 de_DE.UTF8 刺痛ä对我不起作用。 -
适用于我的 Linux 但不适用于 Mac。也许 OS X 的排序规则表是错误的,还是什么? FWIW POSIX 语言环境对于 web 应用程序来说是狡猾的,因为它们是每个进程的,而不是线程安全的。
-
+1 适用于我在 Linux (Ubuntu) 上,但不适用于 Mac 和 FreeBSD。