ICU是否处理不同语言字符串列表的整理?

时间:2009-09-04 14:26:41

标签: internationalization sorting collation icu

我的应用程序可能在单个列表中包含由不同字母/语言组成的字符串。我似乎无法找到任何有关这些分类的正确方法的信息,或ICU支持此功能的任何迹象。

示例列表:

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

4 个答案:

答案 0 :(得分:5)

没有明智的方法可以做到这一点。所有语言都没有通用排序,即使在同一个字母表中也是如此。不同的语言(基本上是文化)已经针对如何对单词进行排序提出了不同的排序规则。

我认为,唯一能够始终如一地执行此操作的方法是使用普通的旧代码点排序(例如,在Java,String.compareTo中)。

您可以提出一些启发式方法,具体取决于您的数据代表什么。您可以根据有关字母和语言的猜测对字符串进行分组,然后对每个组使用特定于语言环境的排序。但是,我认为你必须以艰难的方式(自己编码)这样做,因为根据条款你会猜不同(例如,'mar'是英语动词还是西班牙语名词?)。可以想象,就不可预测的“错误”而言,你最终会得到比天真的Unicode数字排序更差的结果。

与其他任何事情一样,这取决于您能够承担多少费用,以及您需要什么样的性能。

这个建议不是您正在寻找的答案:如果在最初存储字符串时有任何方法可以识别语言环境,您应该这样做,并将其记录为字符串元数据的一部分。那你就不会有这个问题了。

答案 1 :(得分:5)

与上面的所有注意事项一样,这里有一个“标准的通用多语言排序”:unicode collation algorithm(UCA),它不是代码点顺序。从粗略地看一眼this page,ICU似乎处理了UCA和当地偏好的混合。

答案 2 :(得分:2)

如@Zac所述,没有通用排序。代码点排序将保持一致,但可能不是用户期望的。

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

答案 3 :(得分:0)

您可以音译为“目标”语言(所有在一个脚本中)然后排序。但语言对排序有相互冲突的规则。