Java的。比较字符串时忽略重音

时间:2010-03-03 16:54:43

标签: java string compare

问题很简单。 JAVA中是否有任何函数可以比较两个字符串并返回true而忽略重音字符?

String x = "Joao";
String y = "João";

返回相等。

由于

6 个答案:

答案 0 :(得分:62)

我认为您应该使用Collator课程。它允许您设置强度和区域设置,它将适当地比较字符。

来自Java 1.6 API:

  

您可以设置Collat​​or的力量   财产确定的水平   差异被认为是显着的   比较。四个优点是   提供:PRIMARY,SECONDARY,   TERTIARY和IDENTICAL。最正确   赋予语言优势   功能取决于区域设置。对于   例如,在捷克语中,“e”和“f”是   考虑到主要差异,而   “e”和“ě”是次要差异,   “e”和“E”是三级差异   和“e”和“e”是相同的。

我认为这里的重点(人们试图做的)是“Joao”和“João”永远不应该被认为是平等的,但是如果你正在进行排序,你不希望它们被比较基于他们的ASCII值,因为那时你会有像Joao,John,João这样的东西,这是不好的。使用collat​​or类肯定能正确处理它。

答案 1 :(得分:23)

你没有从我这里听到这个(因为我不同意这个问题的前提),但是,你可以使用java.text.Normalizer,并使用NFD进行标准化:这会将重音与信附在上面。然后,您可以过滤掉重音字符并进行比较。

答案 2 :(得分:6)

如果将其配置为忽略变音符号,则Collat​​or为a和á返回0:

public boolean isSame(String a, String b) {
    Collator insenstiveStringComparator = Collator.getInstance();
    insenstiveStringComparator.setStrength(Collator.PRIMARY);
    return insenstiveStringComparator.compare(a, b) == 0;
}

isSame(“a”,“á”)产生真实

答案 3 :(得分:5)

如果要比较/排序忽略重音,请使用apache StringUtils库中的stripAccents

 public int compareStripAccent(String a, String b) {
    return StringUtils.stripAccents(a).compareTo(StringUtils.stripAccents(b));
}

答案 4 :(得分:0)

public boolean insenstiveStringComparator (String a, String b) {
    java.text.Collator collate = java.text.Collator.getInstance();
    collate.setStrength(java.text.Collator.PRIMARY);
    collate.setDecomposition(java.text.Collator.CANONICAL_DECOMPOSITION); 
    return collate.equals(a, b);    
}

答案 5 :(得分:-1)

这些转换的问题在于,从重音字符到非重音字符并不总是有明确的映射。它取决于代码页,本地化等。例如,这是一个带有等同于“a”的重音吗?这不是人类的问题,而是计算机的棘手问题。

AFAIK Java没有内置转换功能,可以查找当前的本地化选项并进行这些转换。您可能需要一些更好地处理unicode的外部库,例如ICU(http://site.icu-project.org/