我在 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 编码的字符串)。
我做错了什么?
最好的问候, 托马斯·科普祖克。
最佳答案
显然,在所有平台上进行排序的唯一方法是使用带有 PyICU 绑定(bind)的 ICU 库 (PyICU on PyPI)。
在 OS X 上:sudo port install py26-pyicu
,注意此处描述的错误:https://svn.macports.org/ticket/23429 (哦,使用 macports 的乐趣)。
不幸的是,PyICUs 文档严重缺乏,但我设法找出了它是如何完成的:
import PyICU
collator = PyICU.Collator.createInstance(PyICU.Locale('pl_PL.UTF-8'))
print [i for i in sorted([u'a', u'z', u'ą'], cmp=collator.compare)]
给出:
[u'a', u'ą', u'z']
另一个专业人士 - @bobince:它是线程安全的,因此在设置请求明智的语言环境时并非无用。
关于Python 没有正确排序 unicode。 Strcoll 没有帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3412933/