首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.equalsIgnoreCase - UpperCase诉LowerCase

String.equalsIgnoreCase - UpperCase诉LowerCase
EN

Stack Overflow用户
提问于 2014-08-26 18:44:09
回答 1查看 3.3K关注 0票数 16

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

代码语言:javascript
复制
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;
    }
}

我理解关于调整特定字母表以检查小写相等的评论,但我想知道为什么大写字母还要检查呢?为什么不直接做更低的情况呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-27 14:37:00

既然问题已经重新开始,我就把答案转到这里。

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

仅仅比较大写是不够的,例如,ASCII字母"i“和大写I加上点"İ”(土耳其字母中使用的İ)有不同的大写字母(它们已经大写了),但它们的小写字母"I“是相同的。(请注意,土耳其语认为I with dot和i不带点是不同的字母,而不仅仅是重音字母,类似于德语中的Umlauts /üvs.a/o/u)。

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

最后,将大写I与点"İ“与小巧无点的I "ı”进行比较。他们的大写字母都没有("İ“比)。"I")也不匹配它们的小写("i“和"ı"),但是大写的小写是相同的("I")。我在希腊字母"ϴ“和"ϑ”(char 1012和977)中发现了另一个例子。

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25513019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档