使用不同区域设置对Python中的字符串集合进行排序

4 投票
4 回答
1668 浏览
提问于 2025-04-15 14:51

我想根据用户的语言偏好来对字符串列表进行排序。我有一个支持多种语言的Python网页应用,应该怎么正确地对字符串进行这种排序呢?

我知道可以设置地区信息,像这样:

import locale
locale.setlocale(locale.LC_ALL, '')

但是这应该在应用启动时就设置好(而且文档上说这不是线程安全的!),那么在每个线程中根据当前用户(请求)的设置来进行设置是个好主意吗?

我希望能有一个类似于函数locale.strcoll(...)的东西,增加一个参数 - 用于排序的语言。

4 个回答

1

为了获得最新和最准确的数据,你需要在你的pyICU中使用最新版本的ICU。

4

我推荐使用 pyICU,这是一个为IBM的开源国际化库 ICU 提供的Python接口。你可以通过下面的方式创建一个Collator对象:

    collator = PyICU.Collator.createInstance(PyICU.Locale.getFrance())

然后,你可以按照法语的规则对一组utf-8编码的字符串进行排序,比如使用 thelist.sort(cmp=collator.compare)

我遇到的唯一问题是,找不到适合MacOSX的现成的PyICU和ICU的版本——最后我只能从源代码构建和安装:ICU的源代码版本是3.6,可以在 这里 找到——那里有Windows和几个Unix版本的二进制文件,但没有Mac的;而PyICU 0.8.1可以在 这里 找到。

尽管有这些构建和安装的问题,以及Python接口的文档比较少,但如果你要做大量国际化相关的工作,ICU真的是个很棒的工具,而PyICU则是一个非常实用的接口!

0

另一个可能的解决办法是使用支持良好地区设置的SQL服务器(可惜的是,sqlite不适合)。这样我就可以把所有数据放到一个临时的内存表里,然后用ORDER BY来选择它们。我觉得这个方法应该比kaizer.se的回答中提到的把地区设置分发到多个进程要好。

撰写回答