2015-09-17 4 views
0

Вот что происходит.Java String.contains() не работает на кириллице

Типы пользователей в "лос ан"

У меня есть куча продуктов, чье расположение "лос анджелис"

если я:

String userInput = "лос ан" 
for(Product product : products) { 

    if(product.getCity().trim().toLowerCase().contains(userInput.trim().toLowerCase())) { 
     System.out.println("MATCH"); 
    } 

} 

Я не получаю MATCH.

Это работает для латинских символов

+1

Проблема, вероятно, не исходит из 'contains', а из' toLowerCase' (проблема локали). – Tunaki

+0

так что я должен использовать вместо toLowerCase? могу ли я сделать что-то вроде игнорирования случая? –

+0

Проблема такая же: игнорирование дела. Это вопрос, зависящий от языка, поскольку один и тот же символ может быть с меньшим положением в зависимости от локали. Вы должны спросить у пользователя их язык и использовать его соответствующим образом. Пожалуйста, обратитесь к этому ответу: http://stackoverflow.com/a/11063161/1743880 – Tunaki

ответ

1

попытка определения локали в toLowerCase() по обе стороны уравнения: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toLowerCase(java.util.Locale)

+0

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

+0

относительно «Какой язык я должен указать для болгарского языка». Я могу дать вам ответ, но вы можете использовать то же самое, что и я: используйте поисковую систему Google. –

+0

относительно «других языков - пользователи, которые будут вводить», вы должны запросить настройки языка, которые пользователь использует. если это происходит из браузера, то обычно есть HTTP-заголовок, содержащий эту информацию. в противном случае вы должны сделать это, чтобы получить эту информацию. –

0

Использование JDK 1.8.0_45, следующий код дает совпадение в обоих случаях:

System.out.println("лос анджелис".trim().toLowerCase().contains("лос ан".trim().toLowerCase())); 
System.out.println("лос анджелис".trim().toLowerCase(Locale.ROOT).contains("лос ан".trim().toLowerCase(Locale.ROOT))); 

Как уже упоминалось, вы можете найти рабочий Locale в качестве аргумента для String#toLowerCase.

1

Редактор и компилятор (javac -encoding) должны использовать одну и ту же кодировку.

Кодирование компилятора выполняется легко. Редактор исходной кодировки может быть протестирован с помощью редактора программиста, такого как NotePad ++ или JEdit, который может переключать кодировки.

Вы можете также и-бежать исходный текст Java, чтобы проверить это:

String userInput = "\u043b\u043e\u0441 \u0430\u043d"; 

Если это не работает, существует несоответствие между кодировками.

Кроме того String.toLowerCase(new Locale("ru", "RU")) или так уже упоминалось.

+0

Пользовательский ввод не является строкой жесткого кодирования, взятой с входа в формат edittext. Как я убегаю? Кроме того, я не могу предположить, что они напишут по-русски, потому что в следующий раз кто-то напишет на греческом или армянском языках :( –

+0

Это «решение» разрешает только ** жестко закодированные константы в Java ** и проверяет правильные кодировки. вероятно, должен работать в UTF-8, Unicode и проверять все из базы данных, файловой системы, локали. –

Смежные вопросы