[英]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.