【问题标题】:Java Unicode strings sortingJava Unicode 字符串排序
【发布时间】:2011-07-22 22:14:06
【问题描述】:

在 Java 中,如何比较 Unicode 字符串?

我的意思是,如果我有几个说日文字符串,当我执行以下操作时:

java.util.Arrays.sort(arrayOfJapaneseStrings);

这些字符串是如何比较和排序的?

【问题讨论】:

    标签: java string unicode collation unicode-string


    【解决方案1】:

    默认情况下,字符串按 Unicode 顺序按字典顺序排序。顺序是 UTF-16,所以某些字符可能不是你想要的,但是日文字符都在 BMP 中,所以你不应该对这些有问题。

    如果您想要不同的排序顺序,可以使用java.text.Collator 类来定义不同的排序顺序。

    【讨论】:

    • 所以“Unicode 顺序”基本上是“升序 Unicode 代码点”?
    • @ryanprayogo:是的。具体来说,它是升序的 Java 字符值,由于 UTF-16,它大多与 Unicode 码点一一对应。 U+10000 以上的字符除外,它们在表示中使用代理字符。
    • “Unicode 顺序”遵循Unicode Collation Algorithm。你在谈论一些不同的东西。请不要谈论 UTF-16;这是一个巨大的尴尬和后宫的痛苦。尝试在 Java 中正确处理 Unicode 是一种折磨。
    • 谢谢,@tchrist。你是对的,我不是说“Unicode 顺序”。我不知道该怎么称呼它,因为“代码点顺序”也会产生误导。也许只是“字符数值的顺序”。
    • 顺便说一句,我没有对 UTF-16 做出判断 :-)。尽管我确实对 Java 将实用版本的 Unicode 带入该语言给予了很多赞誉,但当大多数语言仍然很难使用基本的 Unicode 时。即使在今天,Java 也使得处理大多数文本变得非常简单,但对于特殊用途,您确实需要知道自己在做什么。我还没有遇到与 Java 中的 UTF-16 相关的错误。
    【解决方案2】:

    默认情况下,它采用 UTF-16 字节码比较。这是最快的方法,因此如果您只需要 some 顺序(例如,如果您稍后要使用二进制搜索,则需要它们按顺序排列,但只是“按顺序排列” " 表示无所谓,越快越好)。

    如果您需要在给定语言环境中对用户有意义的排序,请使用 java.text.Collat​​or 类。

    【讨论】:

    • j.t.Collat​​or 类不符合Unicode Collation Algorithm。使用真实的东西。
    • @tchrist 现在是否有对 UCA 的良好支持,有很多支持的语言环境?上次我实际使用 Java 时,UCA 是相当新的,所以我知道从那以后发生了很多变化(为什么我很少回答 Java 问题,只是那些我知道我可以说一些有意义的问题)。
    • Jon,JDK Collat​​or 类仍然实现 UCA,但 ICU’s 实现了。我发现 UCA 通常正是我想要的,甚至没有任何特殊的语言环境,但如果您愿意,ICU 也将 CLDR 数据用于其语言环境业务。我现在将 UCA 用于我所有的文本排序,并且它产生了很大的不同。
    • @tchrist,前段时间我用过一些 ICU 的 C++ 东西,发现它确实非常好。
    【解决方案3】:

    根据compareToString类的方法。见javadoc

    比较两个字符串 按字典顺序。比较基于中每个字符的 Unicode 值 字符串。这个代表的字符序列 String 对象按字典顺序与 由参数字符串表示的字符序列。结果是 如果此 String 对象,则为负整数 按字典顺序在参数字符串之前。结果是一个 如果此 String 对象,则为正整数 按字典顺序 跟随参数字符串。如果字符串结果为零 是平等的; compareTo 返回 0 确切时间 {@link #equals(Object)} 方法将返回 true

    【讨论】:

    • 这看起来像是 UCS-2 旧时代的古话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2014-10-01
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多