【问题标题】:Sort string collection in Python using various locale settings使用各种语言环境设置在 Python 中对字符串集合进行排序
【发布时间】:2010-12-04 07:26:04
【问题描述】:

我想根据用户语言偏好对字符串列表进行排序。我有一个多语言 Python webapp,以这种方式对字符串进行排序的正确方法是什么?

我知道我可以像这样设置语言环境:

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

但这应该在应用程序启动时完成(并且文档说它不是线程安全的!),根据当前用户(请求)设置在每个线程中设置它是个好主意吗?

我想要类似函数 locale.strcoll(...) 的东西,带有附加参数 - 用于排序的语言。

【问题讨论】:

    标签: python google-app-engine sorting web-applications collation


    【解决方案1】:

    鉴于文档警告,如果您尝试在不同线程中设置不同的语言环境,您似乎只能靠自己。

    如果您可以将问题拆分为每个区域设置一个线程,您是否最好使用 Python 2.6 的多处理将其拆分为每个区域设置一个子进程?

    似乎解决这个问题的一切都必须是一个 hack,你甚至可以考虑使用命令行程序 sort (1) 为不同的语言使用不同的 LC_ALL 调用。

    【讨论】:

      【解决方案2】:

      我会推荐pyICU——IBM 丰富的开源ICU 国际化库的Python 绑定。您制作一个 Collat​​or 对象,例如与:

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

      然后你可以排序例如按法语规则列出的 utf-8 编码字符串列表,例如通过使用thelist.sort(cmp=collator.compare)

      我遇到的唯一问题是我没有找到好的打包、立即可用的 PyICU plus ICU for MacOSX 版本——我最终从源代码构建和安装:ICU 自己的源代码 3.6,来自here——有适用于 Windows 和几个 Unix 版本的二进制文件,但不适用于 Mac; PyICU 0.8.1 来自here

      除去这些构建/安装问题,以及 Python 绑定的文档很少,如果您进行大量与 i18n 相关的工作,ICU 真的是天赐之物,而且 PyICU 是一组非常有用的绑定!

      【讨论】:

      • 我已经简要地看到了 pyICU,但我认为这样的功能必须包含在 python 标准库中——而且不太可能。我会试试 pyICU。
      • 语言环境切换(以及一次直接支持多个语言环境)不是标准库的强项,但幸运的是 ICU 提供了真正丰富的 i18n 工具(可惜 PyIcu 缺乏文档和缺乏简单的一体化 Mac OS X 安装程序)。
      • 不幸的是,使用 pyICU,我的应用程序将无法在 Google App Engine 上运行。我会尝试找到纯python解决方案。
      • 是的,你是对的,pyICU 不在 App Engine 支持的非纯 Python 库中。如果您在问题中提到在 App Engine 上运行的限制(在标题、正文和标签中,因为它非常重要!),它会帮助其他人帮助您。
      【解决方案3】:

      您将希望您的 pyICU 下可能有最新的 ICU,以获取最佳和最新的数据。

      【讨论】:

        【解决方案4】:

        另一个可能的解决方案是使用具有良好语言环境支持的 SQL 服务器(不幸的是,sqlite 不是一个选项)。然后我可以将所有数据放到临时内存表中并使用 ORDER BY 选择它们。 IMO 它应该是比 kaizer.se 的回答所建议的将语言环境设置分配给多个进程更好的解决方案。

        【讨论】:

        • 很遗憾,我现在正在使用这种方法。
        猜你喜欢
        • 2012-06-22
        • 2022-01-28
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        • 2011-09-25
        相关资源
        最近更新 更多