2009-09-04 4 views
4

私のアプリケーションでは、アルファベット/言語が異なる文字列を1つのリストに含めることができます。これらのソート方法が正しいか、またはICUがこの機能をサポートしているかについての情報を見つけることはできません。ICUはさまざまな言語の文字列のリストの照合を処理しますか?

例リスト:

  • アップル
  • яблоко
  • μήλο
  • ベビー
  • βρέφος
  • ребенок

答えて

5

上記のすべての注意点がありますが、ここでは「標準ユニバーサル多言語ソート」です:unicode collation algorithm(UCA)です。これはコードポイントの順序ではありません。大まかな一見から、this pageに、ICUはUCAと地方の好みの混合物を扱うようです。

5

には賢明なWAはありませんこれをうまくするにはy。同じアルファベット内であっても、すべての言語に共通の並べ替えはありません。異なる言語(文化、基本的に)では、単語のソート方法について異なる照合ルールが用意されています。

これを一貫して行うための唯一の方法は、古くからのコードポイントソート(例:Java、String.compareTo)を使用することです。

データが表すものに応じて、ヒューリスティックを思いつくことができます。アルファベットと言語に関する推測に基づいて文字列をグループ化し、各グループにロケール固有のソートを使用できます。しかし、用語に応じて違った推測ができるため(英語の動詞やスペイン語の名詞を「mar」しているなど)、難しい方法(コードを自分で作成する)を行う必要があります。予期せぬ「エラー」の点で、単純なUnicode数値ソートより悪い結果に終わることが考えられます。

他のものと同様に、ソリューションに入れる余裕があるか、どんな種類のパフォーマンスが必要かによって異なります。

この提案は、あなたが探している答えではありません。最初に文字列を格納するときにロケールを識別する方法があれば、その文字列のメタデータの一部として記録する必要があります。そうすれば、この問題は起こりません。

2

@ Zacで述べたように、普遍的な並べ替えはありません。コードポイントのソートは一貫していますが、ユーザーが期待するものではない可能性があります。

したがって、ユーザーが選択したロケールの優先順位を使用することをお勧めします。ソート順に定義されていないコードポイントはすべてグループ化されます。

0

「ターゲット」言語(すべて1つのスクリプト内)に翻字して並べ替えることができます。しかし、言語にはソートの規則があります。

関連する問題