4

ユーザーの言語設定に従って文字列のリストを並べ替えたい。多言語の Python Web アプリケーションを使用していますが、そのような方法で文字列を並べ替える正しい方法は何ですか?

次のようにロケールを設定できることはわかっています。

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

しかし、これはアプリケーションの開始時に行う必要があります (そして、ドキュメントはそれがスレッドセーフではないと言っています!)、現在のユーザー (要求) 設定に従ってすべてのスレッドで設定することをお勧めしますか?

関数 locale.strcoll(...) のようなものに、追加のパラメーター (並べ替えに使用される言語) が必要です。

4

4 に答える 4

4

pyICUをお勧めします-IBMの豊富なオープンソースICU国際化ライブラリ用のPythonバインディング。Collat​​orオブジェクトを作成します。例:

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

次に、たとえば。を使用して、フランス語のルールに従ってutf-8でエンコードされた文字列のリストを並べ替えることができますthelist.sort(cmp=collator.compare)

私が抱えていた唯一の問題は、MacOSX用のPyICUとICUの適切なパッケージ化されたすぐに使用できるバージョンが見つからなかったことです-私はソースからビルドしてインストールすることになりました:ICU独自のソース、3.6、ここから-Windows用のバイナリといくつかがありますUnixバージョンがありますが、Mac用ではありません。ここからPyICU0.8.1 。

これらのビルド/インストールの問題と、Pythonバインディングのドキュメントがやや不足していることを除けば、i18​​n関連の作業を大量に行う場合、ICUは本当に天の恵みであり、PyICUは非常に有用なバインディングのセットです。

于 2009-10-06T17:50:30.547 に答える
1

最適で最新のデータを取得するには、pyICU の下に可能な限り最新の ICU が必要です。

于 2009-10-08T19:18:36.560 に答える
0

ドキュメントの警告を考えると、異なるスレッドで異なるロケールを設定しようとすると、自分で設定しているように見えます。

問題をロケールごとに1つのスレッドに分割できる場合、Python 2.6のマルチプロセッシングを使用して、ロケールごとに1つのサブプロセスに問題を分割することはできませんか?

これを解決するすべてがハックであるに違いないようsort (1)です。異なる言語に対して異なるLC_ALLで呼び出されるコマンドラインプログラムの使用を検討することもできます。

于 2009-10-06T15:57:48.630 に答える
0

別の可能な解決策は、適切なロケール サポートを備えた SQL サーバーを使用することです (残念ながら、sqlite はオプションではありません)。次に、すべてのデータを一時メモリ テーブルに配置し、ORDER BY でそれらを選択できます。IMO kaizer.seの回答が推奨するように、ロケール設定を複数のプロセスに配布しようとするよりも、より良い解決策になるはずです。

于 2009-10-09T08:29:49.313 に答える