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