【问题标题】:EqualsIgnoreCase() not working as intended.EqualsIgnoreCase() 未按预期工作。
【发布时间】:2017-10-29 13:00:28
【问题描述】:

当我运行以下程序时,它只打印

equals says they are equal

但是从 java 8 中的 equalsIgnoreCase 文档我们有:

两个字符 c1 和 c2 被认为是相同的忽略大小写,如果 以下至少一项是正确的:
• 应用方法 java.lang.Character.toUpperCase(char) 对每个字符产生相同的结果

    public class Test {
    public static void main(String[] args) {

        String string1 = "abc\u00DF";
        String string2 = string1.toUpperCase();

        if (string1.equalsIgnoreCase(string2))
            System.out.println("equalsIgnoreCase says they are equal");

        if (string1.toUpperCase().equals(string2.toUpperCase()))
            System.out.println("equals says they are equal");

    }
}

所以我的问题是为什么这个程序不打印

equalsIgnoreCase says they are equal

在这两个操作中都使用大写字符。

【问题讨论】:

  • string 1: abcß string 2: ABCSS,总是打印中间步骤或使用调试器查看值

标签: java string locale case-sensitive


【解决方案1】:

您正在使用/比较德语 ß 符号,它的大写产生 SS...所以您需要使用 Locale.German

if (string1.toUpperCase(Locale.GERMAN).equals(string2.toUpperCase(Locale.GERMAN)))

这将返回 true....

【讨论】:

  • 更准确地说:"ß".toUpperCase() == "SS",而 Character.toUpperCase('ß') == 'ß'
  • 解决方法:如果您有依赖于语言环境的字符串并且无法确定它是哪个语言环境,请不要使用 equalsIgnoreCase...
  • FunFact:在德国,如果用大写字母书写,小写的 s "ß" 会变成 "SZ"。
  • @Korashen:那是错误的。自 2006 年以来,替换大写的 ß 仅是 SS。在此之前可以使用 bot SS 和 SZ
  • @Korashen 更新:从现在开始,'ß' 有一个特殊的大写字母 (rechtschreibrat.com/DOX/…)。我想知道,如何在普通德语键盘上生成它,其中 shift-ß 映射到 ?
【解决方案2】:

是的,没错。

如果 (string1.equalsIgnoreCase(string2)) ....

忽略string1和string2的大小写。

如果 (string1.equals(string2)) ....

将检测到有不同的字母并且不打印..它们是相等的。 您的第二个大写转换示例也可以。

【讨论】:

  • 这里的问题是为什么equalsIgnoreCase 说它们相等。
猜你喜欢
  • 2021-06-04
  • 2022-01-24
  • 2015-05-11
  • 2020-05-15
  • 2014-10-31
  • 2018-02-12
  • 2014-01-20
  • 2015-01-13
  • 2013-08-01
相关资源
最近更新 更多