代码之家  ›  专栏  ›  技术社区  ›  TJ Seabrooks

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

  •  4
  • TJ Seabrooks  · 技术社区  · 15 年前

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

    示例列表:

    • 苹果
    • _________
    • _¼___?
    • 婴儿
    • _
    • ____½_
    4 回复  |  直到 14 年前
        1
  •  5
  •   Frédéric Grosshans    14 年前

    有了以上所有的警告,这里有一个“标准通用多语言排序”:即 unicode collation algorithm (UCA),这不是码点顺序。从粗略的一瞥 this page ICU似乎处理UCA和本地偏好的混合。

        2
  •  5
  •   Zac Thompson    15 年前

    没有明智的方法来做好这件事。所有语言都没有通用的分类法,即使是在同一个字母表中。不同的语言(基本上是文化)对单词的排序方式提出了不同的排序规则。

    我认为,唯一做到这一点的方法是使用普通的旧代码点排序(例如在爪哇中,String。

    根据数据所代表的内容,您可以想出一些启发式方法。您可以根据对字母表和语言的猜测对字符串进行分组,然后对每个组使用特定于区域设置的排序。但是你必须用一种很难的方式(自己编代码),我想,因为你会根据术语的不同猜出不同的答案(例如,mar是英语动词还是西班牙语名词?)可以想象,在不可预测的“错误”方面,您最终会得到比简单的Unicode数字排序更糟糕的结果。

    与其他任何事情一样,这取决于您能负担多少投入到解决方案中,以及您需要什么样的性能。

    这个建议并不是您要寻找的答案:如果在最初存储字符串时有任何方法来标识区域设置,您应该这样做,并将其记录为字符串元数据的一部分。那你就不会有这个问题了。

        3
  •  2
  •   devstuff    15 年前

    正如@zac所提到的,没有通用类型。代码点排序将是一致的,但可能不是用户期望的。

    因此,您可能应该使用用户所选区域设置的首选排序顺序。未按该排序顺序定义的任何代码点都将分组在一起。

        4
  •  0
  •   Steven R. Loomis    15 年前

    您可以将其翻译成“目标”语言(全部在一个脚本中),然后进行排序。但是语言的排序规则有冲突。