String.equalsIgnoreCase - UpperCase v.小写

2022-09-03 07:08:03

我正在浏览openjdk,注意到String.equalsIgnoreCase中有一个奇怪的代码路径,特别是方法区域Matches

if (ignoreCase) {
    // If characters don't match but case may be ignored,
    // try converting both characters to uppercase.
    // If the results match, then the comparison scan should
    // continue.
    char u1 = Character.toUpperCase(c1);
    char u2 = Character.toUpperCase(c2);
    if (u1 == u2) {
        continue;
    }
    // Unfortunately, conversion to uppercase does not work properly
    // for the Georgian alphabet, which has strange rules about case
    // conversion.  So we need to make one last check before
    // exiting.
    if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
        continue;
    }
}

我理解关于调整特定字母表以检查小写相等性的评论,但想知道为什么还要进行大写检查?为什么不只做所有小写?


答案 1

现在这个问题重新打开了,我把我的答案转移到这里。

对“为什么他们不只比较小写而不是大写和小写,如果它匹配更多的大小写比大写?”的简短回答:它不匹配更多的字符对,它只是匹配不同的对。

仅比较大写是不够的,例如,ASCII字母“I”和大写字母I与点“İ”(在土耳其语字母表中使用)具有不同的大写字母(它们已经是大写的),但它们具有相同的小写字母“i”。(请注意,土耳其语将带点的 i 和不带点的 i 视为不同的字母,而不仅仅是重音字母,类似于德语的元音变音 ä/ö/ü vs. a/o/u。(char)304

仅比较小写是不够的,例如ASCII字母“i”和小的无点i“ı”()。它们具有不同的小写字母(它们已经是小写的),但它们具有相同的大写字母“I”。(char)305

最后,将大写的 I 与点 “İ” 与小的无点 i “ı” 进行比较。它们的大写字母(“İ”与“I”)和小写字母(“i”与“ı”)都不匹配,但其大写字母的小写字母是相同的(“I”)。我发现了另一个案例,如果这种现象,在希腊字母“Θ”和“θ”(char 1012和977)中。

所以一个真正的不区分大小写的比较甚至不能检查原始字符的大写和小写,而必须检查大写的小写。


答案 2