String.compareIgnoreCase возвращает неверный результат - PullRequest
0 голосов
/ 25 мая 2018

Я использую Java 8.

Я несколько дней пытался понять ошибку, связанную со сравнением строк.Посмотрите на этот тест.Эти две строки различны («i» - это не одно и то же, и не является заглавной / строчной версией другого).

Я ожидаю, что этот тест пройдёт.Первые утверждения успешны, а вторые - нет (по какой-то причине compareIgnoreCase возвращает 0)

Есть идеи, что происходит?

Спасибо

String str1 = "vırus";
String str2 = "virus";
Assert.assertNotEquals(0, str1.compareTo(str2));
Assert.assertNotEquals(0, str1.compareToIgnoreCase(str2));

1 Ответ

0 голосов
/ 25 мая 2018

Javadoc из compareToIgnoreCase говорит:

Сравнивает две строки лексикографически, игнорируя различия регистра.Этот метод возвращает целое число со знаком вызова compareTo с нормализованными версиями строк, где различия в регистре были устранены путем вызова Character.toLowerCase(Character.toUpperCase(character)) для каждого символа.

Символ ı делаетне имеет соответствующей заглавной буквы, поэтому toUpperCase возвращает I, а затем toLowerCase возвращает i.

Аналогично, символ İ не имеет соответствующей строчной буквы, поэтому toLowerCaseвозвращает i.

Это означает, что compareToIgnoreCase считает эти 4 буквы одинаковыми:

Преобразования в верхнем / верхнем / нижнем регистре определяются Unicode, и их можно увидеть по ссылкам выше.В верхнем регистре I даже есть комментарий:

Турецкий и азербайджанский языки используют U + 0131 для строчных букв

А в нижнем регистре i есть комментарий:

Турецкий и азербайджанский используют U + 0130 в верхнем регистре

Как упомянуто в комментарии shmosel :

Это потому, что сравнение символовязыковой регистр.В турецком языке прописными буквами i является İ, а строчными I - ı.

...