Java Unicode 字符串排序

Posted

技术标签:

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

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

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

java.util.Arrays.sort(arrayOfJapaneseStrings);

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

【问题讨论】:

【参考方案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 旧时代的古话。

以上是关于Java Unicode 字符串排序的主要内容,如果未能解决你的问题,请参考以下文章

Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序和排序?

如何比较包含非英文字符的 unicode 字符串以按字母顺序排序?

影响字母排序的不可见 Unicode 字符

深入理解苹果系统(Unicode)字符串的排序方法

深入理解苹果系统(Unicode)字符串的排序方法

什么 MySQL 排序规则最适合接受所有 unicode 字符?