Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA比较字符串时忽略重音符号_Java_String_Compare - Fatal编程技术网

JAVA比较字符串时忽略重音符号

JAVA比较字符串时忽略重音符号,java,string,compare,Java,String,Compare,问题很简单。JAVA中是否有函数可以比较两个字符串并返回true,而忽略重音字符 即 回报是相等的 谢谢这类转换的问题在于,从重音字符到非重音字符并不总是有一个清晰的映射。它取决于代码页、本地化等。例如,这是一个重音相当于“a”的a吗?这对人类来说不是问题,但对计算机来说更棘手 afaikjava没有一个内置的转换,可以查找当前的本地化选项并进行这些类型的转换。您可能需要一些能够更好地处理unicode的外部库,比如ICU()您没有听我说过这一点(因为我不同意这个问题的前提),但是,您可以使用j

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

回报是相等的


谢谢

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


afaikjava没有一个内置的转换,可以查找当前的本地化选项并进行这些类型的转换。您可能需要一些能够更好地处理unicode的外部库,比如ICU()

您没有听我说过这一点(因为我不同意这个问题的前提),但是,您可以使用
java.text.Normalizer
,并使用
NFD
进行规范化:这样可以将重音从附加到的字母中分离出来。然后,您可以过滤掉重音字符并进行比较。

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

从Java 1.6 API:

你可以设置一个收缩器的力量 属性来确定属性的级别 差异被认为是显著的 比较。四大优势是 提供:一级、二级、, 第三,相同。确切的 语文能力的分配 功能取决于区域设置。对于 例如,在捷克语中,“e”和“f”是 考虑了主要差异,而 “e”和“ě”是次要区别, “e”和“e”是第三级差异 “e”和“e”是相同的


我认为这里重要的一点(人们正试图指出)是“Joao”和“João”永远不应该被认为是相等的,但如果你在进行排序,你不希望根据ASCII值对它们进行比较,因为这样你会有Joao、John、João这样的东西,这是不好的。使用collator类肯定能正确处理这一问题。

如果将collator配置为忽略变音符号,则它会为andá返回0:

public boolean isSame(String a, String b) {
    Collator insenstiveStringComparator = Collator.getInstance();
    insenstiveStringComparator.setStrength(Collator.PRIMARY);
    return insenstiveStringComparator.compare(a, b) == 0;
}
如果要比较/排序忽略重音,isSame(“a”、“á”)将产生true

,或者使用apache StringUtils库:

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

但它们并不相等,为什么你希望它们不相等时却相等呢?@fuzzy它们通常都是同一个名字(这是约翰的葡萄牙语版本)。有些人只是懒得在西班牙语中加上重音符号,n和ñ被认为是不同的字母。是的,但以他的例子来说,他似乎想比较姓名,而且不太担心误报。这对搜索非常有用。用户懒得在qwerty键盘上正确键入重音符号。也许这个问题应该重新表述为确定两个字符串是否相似而不是相等。谢谢,这正是我所需要的。StringUtils.stripAccents将这两个步骤合并为一个。这非常有效,尤其是在需要比较国际数据的系统中。1-可能世界上很少有系统能够正确处理任何多语言的事情。下面的线程中提到,即使是java也有错误的Unicode支持。2-当您的服务接受来自第三方的数据时,所有这些数据都会进入管道。因为没有人能始终如一地处理数据。2-如前所述,人们根本没有正确地输入数据。要么是因为懒惰,打字错误等等。。。3-Joao可能是一个西班牙语用户,不幸的是,他使用的是一台英语计算机。@SoftwareMonkey:我也同意,尽管我写了公认的答案:-PFYI的朋友们,创建了一些遵循您的指导原则的代码,谢谢。然而,我没有看到一种方法来进行不区分重音但区分大小写的比较,遵循Collator的规则。。。我错过了什么吗?@Joao你不能在Collator类中这样做,因为力量被设置为最低水平。因此,要区分大小写,您需要第三级,但对于重音不敏感,您只需要第一级。所以他们不会一起工作。您最好使用Chris Jester Young的解决方案过滤掉重音字符,然后正常比较字符串。Java确实有它,它被称为,并且专门针对此类问题。
 public int compareStripAccent(String a, String b) {
    return StringUtils.stripAccents(a).compareTo(StringUtils.stripAccents(b));
}
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);    
}