我的应用程序可能在一个列表中包含由不同字母/语言组成的字符串。我似乎找不到任何关于排序这些的正确方法应该是什么或任何迹象表明 ICU 支持此功能的信息。
示例列表:
- 苹果
- яблоко
- μήλο
- 婴儿
- βρέφος
- ребенок
我的应用程序可能在一个列表中包含由不同字母/语言组成的字符串。我似乎找不到任何关于排序这些的正确方法应该是什么或任何迹象表明 ICU 支持此功能的信息。
示例列表:
没有明智的方法可以很好地做到这一点。即使在同一个字母表中,也没有适用于所有语言的通用排序。不同的语言(基本上是文化)针对单词的排序提出了不同的排序规则。
我认为,唯一能始终如一地做到这一点的方法是使用普通的旧代码点排序(例如,在 Java 中,String.compareTo)。
您可以提出一些启发式方法,具体取决于您的数据所代表的内容。您可以根据对字母和语言的猜测对字符串进行分组,然后对每个组使用特定于区域设置的排序。但是我认为,您必须以艰难的方式进行(自己编码),因为您会根据术语进行不同的猜测(例如,“mar”是英语动词还是西班牙语名词?)。可以想象,就不可预测的“错误”而言,您最终会得到比天真的 Unicode 数字排序更糟糕的结果。
与其他任何事情一样,这取决于您能负担得起多少投入到解决方案中,以及您需要什么样的性能。
此建议不是您要寻找的答案:如果在最初存储字符串时有任何方法可以识别语言环境,您应该这样做,并将其记录为字符串元数据的一部分。那你就不会有这个问题了。
除了上述所有注意事项外,这里还有一种“标准通用多语言排序”:unicode collation algorithm (UCA),它不是代码点顺序。粗略浏览一下这个页面,ICU 似乎处理了 UCA 和本地偏好的混合。
正如@Zac 所提到的,没有通用的排序。代码点排序将是一致的,但可能不是用户期望的。
因此,您可能应该为用户选择的语言环境使用首选排序顺序。未按该排序顺序定义的任何代码点都将组合在一起。
您可以音译成您的“目标”语言(全部在一个脚本中)然后排序。但是语言有相互冲突的排序规则。