【问题标题】:Java. Ignore accents when comparing strings爪哇。比较字符串时忽略重音符号
【发布时间】:2011-01-23 07:29:54
【问题描述】:

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

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

返回相等的。

谢谢

【问题讨论】:

  • 但是那些是相等的,当它们不相等的时候你为什么要它们相等呢?
  • @fuzzy 通常是同一个名字(这是约翰的葡萄牙语版本)。有些人只是懒得包含口音
  • 在西班牙语中,n 和ñ 被认为是不同的字母。
  • 是的,但是以他的例子来说,他似乎想比较名字并且不太担心误报
  • 这对于搜索非常有用。用户懒得在 qwerty 键盘上正确键入重音符号。也许这个问题应该改写为确定两个字符串是否相似而不是相等。

标签: java string compare


【解决方案1】:

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

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

【讨论】:

  • Java 确实有它,它被称为Collater,是专门为这类问题而设计的。
【解决方案2】:

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

【讨论】:

  • 谢谢,这正是我所需要的。
  • 两步通过StringUtils.stripAccents合二为一commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/…
  • 这非常有效,尤其是在需要比较国际数据的系统中。 1- 世界上可能很少有系统能正确处理多语种。例如,在下面的线程中提到,即使是 java 也有错误的 Unicode 支持。 2-当您的服务接受来自 3rd 方的数据时,所有这些数据都会失败。因为没有人始终如一地处理数据。 2- 如前所述,人们根本没有正确输入数据。要么是因为懒惰、拼写错误等... 3- Joao 可能也是西班牙用户,不幸的是使用英文电脑。
【解决方案3】:

我认为您应该使用Collator 类。它允许您设置强度和语言环境,它会适当地比较字符。

来自 Java 1.6 API:

您可以设置整理者的强度 属性来确定水平 差异被认为是显着的 比较。四大实力是 提供:小学、中学、 第三和相同的。最正确 语言优势分配 功能取决于语言环境。为了 例如,在捷克语中,“e”和“f”是 考虑主要差异,而 “e”和“ě”是次要区别, “e”和“E”是三级差异 和 "e" 和 "e" 是相同的。

我认为这里的重点(人们试图提出的)是“Joao”和“João”永远不应该被视为相等,但如果您正在进行排序,您不希望它们根据他们的 ASCII 值,因为那样你会得到像 Joao、John、João 这样的东西,这不好。使用 collat​​or 类肯定可以正确处理这个问题。

【讨论】:

  • @Software Monkey:我也同意,尽管我写了接受的答案。 :-P
  • 仅供参考,创建了一些代码 here 遵循您的指导方针,非常感谢。但是,我没有看到一种方法来进行不区分重音但区分大小写的比较,遵循整理者的规则......我错过了什么吗?
  • @Joao 您将无法使用 Collat​​or 类执行此操作,因为强度设置为最低级别。因此,要区分大小写,您需要 TERTIARY,但对于重音不敏感,您只需要 PRIMARY。所以他们不会一起工作。您可能会更好地使用 Chris Jester-Youngs 解决方案来过滤掉重音字符,然后正常比较字符串。
【解决方案4】:

如果您将其配置为忽略变音符号,Java 的 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", "á") 为真

【讨论】:

    【解决方案5】:

    如果你想比较/排序忽略重音,或者使用 apache StringUtils 库中的stripAccents

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

    【讨论】:

      【解决方案6】:
      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);    
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-28
        • 2010-09-26
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多