在浏览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;
}
}我理解关于调整特定字母表以检查小写相等的评论,但我想知道为什么大写字母还要检查呢?为什么不直接做更低的情况呢?
发布于 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)中发现了另一个例子。
因此,真正的不区分大小写的比较甚至不能检查原始字符的大写和小写,而必须检查大写字母的小写。
https://stackoverflow.com/questions/25513019
复制相似问题