well when I look at StringUtil I found something like this. final char c1 = cs.charAt(index1++); final char c2 = substring.charAt(index2++);
if (c1 == c2) { continue; } if (!ignoreCase) { return false; } // The same check as in String.regionMatches(): if (Character.toUpperCase(c1) != Character.toUpperCase(c2) && Character.toLowerCase(c1) != Character.toLowerCase(c2)) { return false; } But it actually is not quite same to what in String.regionMatches. the code part in String.regionMatches. in JKD8 is actually char c1 = ta[to++]; char c2 = pa[po++]; if (c1 == c2) { continue; } 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; } } see, the chars to invoke Character.toLowerCase is actually u1 and u2, but according to logic in CharSequenceUtils they should be c1 and c2. If they are functional equal, then why oracle guys create the two variables u1 and u2? That is a waste of time then. So I think it might be a bug. But me myself know nothing about Georgian. Is there anybody familiar with Georgian alphabet and willing to do further debug about this?