问题很简单。 JAVA中是否有任何函数可以比较两个字符串并返回true而忽略重音字符?
即
String x = "Joao";
String y = "João";
返回相等。
由于
答案 0 :(得分:62)
我认为您应该使用Collator课程。它允许您设置强度和区域设置,它将适当地比较字符。
来自Java 1.6 API:
您可以设置Collator的力量 财产确定的水平 差异被认为是显着的 比较。四个优点是 提供:PRIMARY,SECONDARY, TERTIARY和IDENTICAL。最正确 赋予语言优势 功能取决于区域设置。对于 例如,在捷克语中,“e”和“f”是 考虑到主要差异,而 “e”和“ě”是次要差异, “e”和“E”是三级差异 和“e”和“e”是相同的。
我认为这里的重点(人们试图做的)是“Joao”和“João”永远不应该被认为是平等的,但是如果你正在进行排序,你不希望它们被比较基于他们的ASCII值,因为那时你会有像Joao,John,João这样的东西,这是不好的。使用collator类肯定能正确处理它。
答案 1 :(得分:23)
你没有从我这里听到这个(因为我不同意这个问题的前提),但是,你可以使用java.text.Normalizer
,并使用NFD
进行标准化:这会将重音与信附在上面。然后,您可以过滤掉重音字符并进行比较。
答案 2 :(得分:6)
如果将其配置为忽略变音符号,则Collator为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/)