Java的。 比较string时忽略重音符号

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

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

回报是平等的。

谢谢

我想你应该使用Collat​​or类。 它可以让你设置一个强度和语言环境,它会适当地比较字符。

从Java 1.6 API:

您可以设置Collat​​or的强度属性,以确定比较中被认为有重要意义的差异水平。 提供了四大优势:小学,中学,第三,和相同。 语言特征的确切分配是由语言环境决定的。 例如,在捷克语中,“e”和“f”被认为是主要差异,而“e”和“ě”是次要差异,“e”和“E”是第三差异,“e”和“e”是相同的。

我想这里的重点(人们试图做的)是“Joao”和“João”不应该被认为是平等的,但是如果你正在进行sorting,你不希望它们根据它们的ASCII值进行比较因为那样你会有Joao,John,João这样的事情,这不好。 使用collat​​or类绝对可以正确处理这个问题。

你没有听到这个消息(因为我不同意这个问题的前提),但是,你可以使用java.text.Normalizer ,并用NFD规范化处理:这样就把它所附的字母的口音分开了。 然后,您可以过滤掉重音字符并进行比较。

对于a和col,collat​​or返回0,如果将其configuration为忽略变音符:

 public boolean isSame(String a, String b) { Collator insenstiveStringComparator = Collator.getInstance(); insenstiveStringComparator.setStrength(Collator.PRIMARY); // Collator.PRIMARY also works, but is case senstive return insenstiveStringComparator.compare(a, b) == 0; } 

isSame(“a”,“á”)是正确的

或者,如果您想比较/sorting忽略重音,请使用apache StringUtils库中的stripAccents :

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

这种转换的问题在于,并不总是从重音字符到非重音字符的清晰映射。 这取决于代码页,本地化等。例如,这是一个口音相当于“一个”? 对于一个人来说不是一个问题,但是对于计算机来说更棘手。

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