7

我在比较字符串时遇到问题。我想像这样比较两个“éd”和“ef”法语文本

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

这将打印-1,但在法语字母表中e出现é。但是当我们只比较e并且é像这样

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

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

4

2 回答 2

5

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

Android javadoc给出了它为什么会这样的提示 - 我想 android 中的实现细节与标准 JDK 相似,如果不相同的话:

当字符串中的任何位置存在主要或次要差异时,忽略三次差异。

换句话说,因为您的 2 个字符串可以通过仅查看主要差异(不包括重音)来排序,所以整理器不会检查其他差异。

它似乎符合Unicode Collat​​ion Algorithm (UCA)

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

根据维基百科关于“ordre alphabetique”的文章,这似乎也是用法语按字母顺序排序的正确方法:

En première analysis, les caractères accentués, de meme que les majuscules, ont le meme rang alphabétique que le caractère fundamental
Si plusieurs mots ont le meme rang alphabétique, on tâche de les distinguer entre eux grâce aux majuscules et aux 口音 (pour le e,在 l'ordre e, é, è, ê, ë)

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

于 2012-08-10T13:17:59.017 回答
0

JavaDoc

您可以设置 Collat​​or 的强度属性来确定在比较中被认为显着的差异水平。提供了四种强度:初级、次级、第三和相同。语言特征的强度的确切分配取决于语言环境。例如,在捷克语中,“e”和“f”被认为是主要差异,而“e”和“ě”是次要差异,“e”和“E”是三次差异,“e”和“e”是相同的.

尝试不同的优势:

localeSpecificCollator.setStrength(Collator.PRIMARY);

看看会发生什么。

于 2012-08-10T10:15:49.207 回答