java Collat​​ionKey排序错误

Ash*_*hot 7 java locale compare

我在比较字符串时遇到问题.我想比较两个"éd"和"ef"这样的法语文本

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE);
CollationKey a = localeSpecificCollator.getCollationKey("éd");
CollationKey b = localeSpecificCollator.getCollationKey("ef");
System.out.println(a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)

这将打印-1,但在法语字母表e之前é.但是当我们只比较eé喜欢这样的时候

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE);
CollationKey a = localeSpecificCollator.getCollationKey("é");
CollationKey b = localeSpecificCollator.getCollationKey("e");
System.out.println(a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)

结果是1.你能告诉我们第一部分代码有什么问题吗?

ass*_*ias 5

这似乎是预期的行为,也是用法语按字母顺序排序的正确方法。

Android的javadoc中给出了一个提示,为什么它的行为就像是-我想执行的细节在android系统是相似的,如果不相同,在标准JDK:

当字符串中任何地方存在一次或二次差异时,将忽略三次差异。

换句话说,由于仅通过查看主要差异(不包括重音符号)就可以对您的2个字符串进行排序,因此整理程序不会检查其他差异。

它似乎符合Unicode排序算法(UCA)

如果基本字母不同,通常会忽略口音差异。

根据Wikipedia上有关“ ordre Alphabetique”的文章,这似乎也是用法语按字母顺序排序的正确方法:

进行高级分析,重音符号,
大型艺术作品,古典音乐的基本特征,以及在古典音乐上的古典音乐,古典艺术在l'ordre e,é,è,ê,ë)

用英语:顺序最初会忽略重音和大小写-如果无法以这种方式对2个单词进行排序,则会考虑重音和大小写。