Java equalsIgnoreCase завершается с ошибкой ß («Sharp S» используется в немецком алфавите) - PullRequest
15 голосов
/ 26 августа 2009

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 26 августа 2009

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

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

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

2 голосов
/ 26 августа 2009

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

2 голосов
/ 26 августа 2009

У Аарона Дигуллы есть . Кроме того, не имеет смысла преобразовывать строку при отсутствии данных локали. На английском языке верхний регистр i равен I , но на турецком это & # x0130; . String.compareIgnoreCase не учитывает данные локали.

(Кроме того, вы можете рассмотреть нормализацию , или вы в конечном итоге задаетесь вопросом, почему "& # x00E9;". Equals ("& # x0065; & # x0301 ; ") может возвращать false. Причина: один представляет собой последовательность объединения .)

0 голосов
/ 26 августа 2009

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

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

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

...