我在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编码的字符串)。
我做错了什么?
最好的祝福,
Tomasz Kopczuk。
最佳答案
显然,在所有平台上进行排序的唯一方法是使用带有PyICU绑定(bind)(PyICU on PyPI)的ICU库。
在OS X上:sudo port install py26-pyicu
,此处描述的提示错误:https://svn.macports.org/ticket/23429(使用Macports的乐趣)。
不幸的是,严重缺乏PyICU的文档,但是我设法找到了它的完成方法:
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:它是线程安全的,因此在设置请求方式的语言环境时并非没有用。