2009-09-04 12 views
4

我的应用程序可能在一个列表中包含不同字母/语言的字符串。我似乎无法找到任何有关排序这些方法的正确方法或ICU支持此功能的任何信息。ICU是否处理不同语言字符串列表的整理?

示例列表:

  • 苹果
  • яблоко
  • μήλο
  • 婴儿
  • βρέφος
  • ребенок

回答

5

针对上述所有注意事项,这里是一个“标准通用多语言排序”:unicode collation algorithm(UCA),它不是码点顺序。从this page粗略地看一眼,ICU似乎处理UCA和本地优先级的混合物。

5

没有合理的WA Ÿ做得好。所有语言都不存在通用排序,即使在同一个字母表中也是如此。不同的语言(文化,基本上)已经提出了不同的排序规则,以便如何排序词语。

我认为唯一可以一致做到这一点的方法是使用普通的旧码点排序(例如在Java中,String.compareTo)。

您可以想出一些启发式方法,具体取决于您的数据所代表的内容。您可以根据对字母和语言的猜测对字符串进行分组,然后针对每个组使用特定于语言环境的排序。但是,我认为,由于你会根据不同的术语(例如“mar”英语动词或西班牙名词?)做出不同的猜测,所以你不得不这样做(自己编码)。就不可预知的“错误”而言,可以想象,最终的结果会比天真的Unicode数字排序更糟糕。

与其他任何事情一样,这取决于您能够承受多少投入解决方案以及您需要哪种性能。

这个建议是不是你要找的答案:如果有任何的方式来识别区域时,最初存储的字符串,你应该这样做,并且把它记为字符串的元数据的一部分。那么你不会有这个问题。

2

正如@Zac所说,没有通用的排序方式。代码点排序将是一致的,但可能不是用户期望的。

因此,您应该使用用户所选语言环境的首选排序顺序。任何未按该排序顺序定义的代码点将被组合在一起。

0

你可以音译为你的“目标”的语言(都在同一个脚本),然后排序。但是语言在排序上有冲突的规则。