String.equalsIgnoreCase - UpperCase v.LowerCase

Dan*_*n W 12 java string openjdk equals

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*rau 10

现在问题重新打开了,我在这里转移答案.

简单回答"为什么它们不仅仅比较小写而不是大写和小写,如果它匹配大于大写的情况?":它不匹配更多的字符对,它只匹配不同的对.

仅比较大写是不够的,例如ASCII字母"I"和带有点"İ"的(char)304大写字母I(在土耳其字母表中使用)具有不同的大写字母(它们已经是大写字母),但它们具有相同的小写字母"i" .(请注意,土耳其语认为我用点而我没有点作为不同的字母,而不仅仅是一个带有重音的字母,类似于德语及其变音符号ä/ö/ü与a/o/u.)

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

最后,比较资本I和点"İ"与小无点我"ı".它们的大写字母("İ"与"I")和它们的小写字母("i"与"ı")都不匹配,但它们的大写字母的小写字母是相同的("I").我发现了另一种情况,如希腊字母"Θ"和"θ"(字符1012和977)中的这种现象.

因此,真正不区分大小写的比较甚至无法检查原始字符的大写字母和小写字母,但必须检查大写字母的小写字母.