Подтвердить что ты не робот

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;
    }
}

Я понимаю комментарий о настройке для конкретного алфавита, чтобы проверить равенство в нижнем регистре, но задавался вопросом, почему даже проверка в верхнем регистре? Почему бы просто не сделать все строчные буквы?

4b9b3361

Ответ 1

Теперь, когда вопрос снова открыт, я передаю свой ответ здесь.

Короткий ответ на вопрос: "Почему они не просто сравнивают только строчные буквы, а не как верхний, так и нижний регистр, если они соответствуют большему количеству случаев, чем прописные?": он не соответствует больше пар символов, он просто соответствует различным парам.

Сравнение только прописных букв недостаточно, например. буква ASCII "I" и столица я с точкой "İ" ((char)304, используемые в турецком алфавите) имеют разные прописные буквы (они уже имеют верхний регистр), но они имеют одну и ту же строчную букву "i". (Обратите внимание, что турецкий язык считает, что я с точкой и я без точки в виде разных букв, а не только буквы с акцентом, похожей на немецкий с ее Umlauts ä/ö/ü против a/o/u.)

Сравнивать только строчные буквы недостаточно, например. ASCII-букву "i" и маленькую точку "i" ((char)305). У них разные строчные буквы (они уже строчные), но они имеют одну и ту же прописную букву "I".

И, наконец, сравните капитал я с точкой "İ" с небольшим бесцеремонным я "ı". Ни их верхние регионы ( "İ" , "I" ), ни их нижние регионы ( "i" и "ı" ) не совпадают, но нижний регистр их прописных букв одинаковый ( "I" ). Я нашел другой случай, если это явление, в греческих буквах "Θ" и "θ" (char 1012 и 977).

Таким образом, истинное нечувствительное к регистру сравнение не может даже проверять верхние и нижние регионы исходных символов, но должно проверять нижние регионы верхних строчек.