2009-09-04 43 views
4

我的應用程序可能在一個列表中包含不同字母/語言的字符串。我似乎無法找到任何有關排序這些方法的正確方法或ICU支持此功能的任何信息。ICU是否處理不同語言字符串列表的整理?

示例列表:

  • 蘋果
  • яблоко
  • μήλο
  • 嬰兒
  • βρέφος
  • ребенок

回答

5

針對上述所有注意事項,這裏是一個「標準通用多語言排序」:unicode collation algorithm(UCA),它不是碼點順序。從this page粗略地看一眼,ICU似乎處理UCA和本地優先級的混合物。

5

沒有合理的WA Ÿ做得好。所有語言都不存在通用排序,即使在同一個字母表中也是如此。不同的語言(文化,基本上)已經提出了不同的排序規則,以便如何排序詞語。

我認爲唯一可以一致做到這一點的方法是使用普通的舊碼點排序(例如在Java中,String.compareTo)。

您可以想出一些啓發式方法,具體取決於您的數據所代表的內容。您可以根據對字母和語言的猜測對字符串進行分組,然後針對每個組使用特定於語言環境的排序。但是,我認爲,由於你會根據不同的術語(例如「mar」英語動詞或西班牙名詞?)做出不同的猜測,所以你不得不這樣做(自己編碼)。就不可預知的「錯誤」而言,可以想象,最終的結果會比天真的Unicode數字排序更糟糕。

與其他任何事情一樣,這取決於您能夠承受多少投入解決方案以及您需要哪種性能。

這個建議是不是你要找的答案:如果有任何的方式來識別區域時,最初存儲的字符串,你應該這樣做,並且把它記爲字符串的元數據的一部分。那麼你不會有這個問題。

2

正如@Zac所說,沒有通用的排序方式。代碼點排序將是一致的,但可能不是用戶期望的。

因此,您應該使用用戶所選語言環境的首選排序順序。任何未按該排序順序定義的代碼點將被組合在一起。

0

你可以音譯爲你的「目標」的語言(都在同一個腳本),然後排序。但是語言在排序上有衝突的規則。