我正在浏览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;
}
}
我理解关于调整特定字母表以检查小写字母相等的评论,但是想知道为什么即使有大写字母检查?为什么不做所有小写?
答案 0 :(得分:10)
现在问题重新打开,我在这里转移答案。
简单回答“为什么它们不仅仅比较小写而不是大写和小写,如果它匹配的情况多于大写?”:它与更多字符对不匹配,它只匹配不同的对。
仅比较大写是不够的,例如ASCII字母“I”和带有点“İ”((char)304
,在土耳其语字母表中使用)的大写字母I具有不同的大写字母(它们已经是大写字母),但它们具有相同的小写字母“i”。 (请注意,土耳其语认为我用点而我没有点作为不同的字母,而不仅仅是一个重音字母,类似于德语及其元音ä/ö/ü与a / o / u。)
仅比较小写是不够的,例如ASCII字母“i”和小无点i“ı”((char)305
)。它们具有不同的小写字母(它们已经是小写),但它们具有相同的大写字母“I”。
最后,将资本I与点“İ”与小无点我“ı”进行比较。它们的大写字母(“İ”与“I”)和它们的小写字母(“i”与“ı”)都不匹配,但它们的大写字母的小写字母是相同的(“I”)。我在希腊字母“Θ”和“θ”(字符1012和977)中发现了另一种情况。
因此,真正不区分大小写的比较甚至无法检查原始字符的大写字母和小写字母,但必须检查大写字母的小写字母。