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

fra*_*ara 54 java string compare

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

String x = "Joao";
String y = "João";
Run Code Online (Sandbox Code Playgroud)

回报是平等的.

谢谢

Dav*_*ton 65

我认为你应该使用Collat​​or类.它允许您设置强度和区域设置,它将适当地比较字符.

从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类肯定会正确处理它.

  • @Software Monkey:即使我写了接受的答案,我也同意.:-P (3认同)

Chr*_*ung 24

你没有从我这里听到这个(因为我不同意这个问题的前提),但是,你可以使用java.text.Normalizer,并用NFD以下标准化:这会从它附加的字母中分离出重音.然后,您可以过滤掉重音字符并进行比较.

  • 这两个步骤由StringUtils.stripAccents合并为一个http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/StringUtils.html (4认同)

Ben*_*ema 7

如果将其配置为忽略变音符号,则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;
}
Run Code Online (Sandbox Code Playgroud)

isSame("a","á")产生真实


小智 7

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

 public int compareStripAccent(String a, String b) {
    return StringUtils.stripAccents(a).compareTo(StringUtils.stripAccents(b));
}
Run Code Online (Sandbox Code Playgroud)