繁体   English   中英

String.equalsIgnoreCase - 大写与小写

[英]String.equalsIgnoreCase - UpperCase v. LowerCase

我正在浏览 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;
    }
}

我理解关于调整特定字母以检查小写相等性的评论,但想知道为什么还要检查大写? 为什么不全部小写呢?

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

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

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

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

最后,将大写 I 与点 "İ" 与小的无点 i "ı" 进行比较。 它们的大写字母(“İ”与“I”)和小写字母(“i”与“ı”)都不匹配,但它们的大写字母的小写字母相同(“I”)。 如果出现这种现象,我发现了另一种情况,即希腊字母“ϴ”和“ϑ”(字符 1012 和 977)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM