Ответ 1
Я думаю, вы должны использовать locale,
Например, "TITLE".toLowerCase() в турецкой локали возвращается "tıtle", где "ı" - характер ЛАТИНСКОГО МАЛЕНЬКОГО ПИСЬМА DOTLESS I. к получить правильные результаты для нечувствительных к языку строк, использовать toLowerCase (Locale.ENGLISH).
Я ссылаюсь на эти ссылки как на решение вашей проблемы и он имеет смысл учесть в вашей ситуации "турецкий"
**FROM THE LINKS**
toLowerCase() уважает интернационализацию (i18n). Он выполняет преобразование случая в отношении вашего языка. Когда вы звоните toLowerCase(), внутренне toLowerCase (Locale.getDefault()) получает называется. Он чувствителен к локали, и вы не должны писать логику вокруг он интерпретирует локаль независимо.
import java.util.Locale;
public class ToLocaleTest {
public static void main(String[] args) throws Exception {
Locale.setDefault(new Locale("lt")); //setting Lithuanian as locale
String str = "\u00cc";
System.out.println("Before case conversion is "+str+
" and length is "+str.length());// Ì
String lowerCaseStr = str.toLowerCase();
System.out.println("Lower case is "+lowerCaseStr+
" and length is "+lowerCaseStr.length());// iı`
}
}
В приведенной выше программе просмотрите длину строки до и после преобразование. Это будет 1 и 3. Да длина строки перед и после конвертации случаев. Ваша логика пойдет на тотализацию когда вы зависите от длины строки в этом сценарии. Когда ваша программа выполняется в другой среде, он может выйти из строя. Это будет хороший улов в обзоре кода.
Чтобы сделать его более безопасным, вы можете использовать другой метод toLowerCase (Locale.English) и всегда переопределять языковой стандарт на английский. Но тогда вы не интернационализированы.
Итак, суть: toLowerCase() специфична для локали.
Dotless-i, является строчным "i" без точки. Верхний регистр этого символа - обычное "я". Есть еще один персонаж: "Я с точкой". В нижнем регистре этого символа используется обычный строчный "i" .
Вы заметили проблему? Это несимметричное преобразование вызывает серьезную проблему при программировании. Мы сталкиваемся с этой проблемой в основном в Java-приложениях из-за плохой реализации функций toLowerCase и toUpperCase (IMHO).
В Java метод String.toLowerCase() преобразует символы в нижний регистр в соответствии со стандартом по умолчанию. Это вызывает проблемы, если ваше приложение работает в турецком языке, и особенно если вы используете эту функцию для имени файла или URL-адреса, который должен подчиняться определенному набору символов.
Ранее я писал о двух серьезных примерах: ошибки компиляции с Script библиотеками с "i" в их именах и с ошибкой XSP Manager, если XPage находится в базе данных с именем "I" в его имени.
Существует длинная история, как я уже сказал. Например, в некоторых версиях R7 маршрутизатор не смог отправить сообщение получателю, если его имя начинается с "I". Агент сообщений не работал в турецком языке до R8. Любой пользователь с турецким языком не смог установить Lotus Notes 8.5.1 (это реально!). Список продолжается...
В Турции почти нет бета-тестеров, и клиенты не открывают PMR для этих проблем. Таким образом, эти проблемы не соответствуют первому приоритету для разработчиков.
Даже команда Java добавила специальное предупреждение к последней документации:
Этот метод чувствителен к локали и может давать неожиданные результаты, если используется для строк, которые предназначены для интерпретации locale независимо. Примерами являются идентификаторы языка программирования, протокол ключи и теги HTML. Например, "TITLE".toLowerCase() на турецком языке locale возвращает "tıtle", где "ı" - ЛАТИНСКАЯ МАЛЕНЬКАЯ ПИСЬМА DOTLESS я персонаж. Чтобы получить правильные результаты для нечувствительных к языку строк, используйте toLowerCase (Locale.ENGLISH).
ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ССЫЛКИ, ЧТО Я НЕ МОГУ ПОЛУЧИТЬ ВСЕ ЭТОГО "ЭТО ОТВЕТ НА ВАШ КОММЕНТАРИЙ"