Java equalsIgnoreCase не работает с ß ( "Sharp S", используемым на немецком алфавите)

мой первый вопрос здесь:-)
Я лучше всего читал правила и искал, был ли ранее задан вопрос.

Следующий код

    String[] strings = {"cAsE", "\u00df"};
    for (String str : strings) {
        System.out.println(str.equalsIgnoreCase(str.toLowerCase()));
        System.out.println(str.equalsIgnoreCase(str.toUpperCase()));
    }

выводит true 3 раза (cAsE = case; cAsE = CASE; ß = ß) но также 1 ложный (ß!= SS). Пробовал использовать toLowerCase (Locale), но он не помог.

Это известная проблема?

Ответ 1

До недавнего времени Unicode не определял прописную версию s-sharp. Я не уверен, что последняя версия Java 7 уже включает этот новый символ и правильно ли он обрабатывает его. Я предлагаю попробовать.

Причина, по которой str.toLowerCase() не возвращает то же, что и str.toUpperCase().toLowerCase(), заключается в том, что Java заменяет ß на SS, но нет способа вернуться, поэтому SS становится SS, а сравнение выходит из строя.

Итак, если вам нужно выровнять регистр, вы должны использовать str.toLowerCase(). Если нет, то просто работать с вызовом equalsIgnoreCase() без какого-либо верхнего/нижнего преобразования тоже должно работать.

Ответ 2

Aaron Digulla has it. Also, it isn't meaningful to transform the string in the absence of locale data. In English, the upper case of i is I, but in Turkish it is İ. String.compareIgnoreCase does not take locale data into account.

(As an aside, you might want to look into normalization, or you'll end up wondering why "é".equals( "é" ) can return false. Reason: one is a combining sequence.)

Ответ 3

Юникод не определил прописную версию s-sharp это точная точка - на немецком языке нет возможности резкого-s (ß) быть столицей или начальной буквой любого слова. поэтому его просто бессмысленное рассуждение о капитале ß...

Ответ 4

Hm. Я ничего не знаю о немецком языке, но я не уверен, как я отношусь к тому, что символы Юникода воспринимаются как эквивалентные расширению римской буквы. Должны ли вы сделать следующее?

myDictionary.put("glasses", new Bifocals());
myDictionary.get("glaßes");

Если у вас есть ваши druthers, myDictionary.get("glaßes") должен вернуть что-то Bifocals из ранее. Это правда?