equalsIgnoreCase()无法按预期工作。

8
当我运行以下程序时,它只打印出:
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

由于两种操作都使用大写字符。


3
字符串1:abcß 字符串2:ABCSS,始终打印中间步骤或使用调试器查看值 - Christophe Roussy
2个回答

11

你正在使用/比较德语中的ß标志,它的大写形式为SS... 因此你需要使用Locale.German

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

将返回 true 的语句....


6
更准确地说:"ß".toUpperCase() == "SS",而Character.toUpperCase('ß') == 'ß'。 - Florian Schaetz
解决方法:如果您有依赖于语言环境的字符串并且无法确定它是哪种语言环境,请不要使用equalsIgnoreCase。 - Florian Schaetz
2
趣闻:在德国,小写的两个 s 连起来形成的字母 "ß" 如果写成大写,则会变成 "SZ"。 - Korashen
3
@Korashen说的不对。自2006年起,大写字母中ß的替代字符只能是SS。在此之前,既可以使用SS,也可以使用SZ。 - P.J.Meisch
1
@Korashen 更新:从现在开始,'ß' 有一个特殊的大写形式 (http://www.rechtschreibrat.com/DOX/rfdr_PM_2017-06-29_Aktualisierung_Regelwerk.pdf)。我想知道如何在普通的德语键盘上产生它,因为 shift-ß 映射到 ? - P.J.Meisch
显示剩余4条评论

0

是的,这是正确的。

if (string1.equalsIgnoreCase(string2)) ....

忽略 string1 和 string2 的大小写。

if (string1.equals(string2)) ....

会检测到不同的字母,并且不会打印“它们相等”。 您的第二个示例也可以进行大写转换。


这里的问题是为什么 equalsIgnoreCase 说它们不相等。 - Hulk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接