Использование локалей с Java toLowerCase () и toUpperCase ()
Мне нужен код для преобразования всех символов в строках в верхний или нижний регистр на Java.
Я нашел метод, который выглядит примерно так:
public static String changelowertoupper() { String str = "CyBeRdRaGoN"; str=str.toLowerCase(Locale.ENGLISH); return str; }
Теперь я прочитал, что с использованием определенных Locale
s, таких как турецкий, «возвращает i (без точки) вместо i (с точкой) ».
- Когда строка будет мусором, собранным в java
- Как найти n-ое появление символа в строке?
- Преобразование шестнадцатеричной строки в массив байтов
- Лучше ли использовать String.format над строкой Concatenation в Java?
- Как преобразовать строку в CharSequence?
Безопасно ли использовать Locale
такие как Великобритания, США, АНГЛИЙСКИЙ и т. Д.? Существуют ли большие различия между ними при применении к строкам?
Какой из наиболее предпочтительных Locale
для String
?
- Как конвертировать UTF-8 std :: string в UTF-16 std :: wstring?
- Разделить строку на массив символов?
- Разница между пустой и пустой ("") строкой Java
- Как преобразовать строку в UTF-8 в C #?
- Проверьте, если символы в строке в R
- Как преобразовать / разобрать из String в char в java?
- Строка заменит обратную косую черту
- C # Разделить строку на другую строку
Я думаю, вы должны использовать язык,
Например, «TITLE» .toLowerCase () в турецком языке возвращает «tıtle», где «ı» – символ LATIN SMALL LETTER 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 () специфичен для локали.
ссылка 1
ссылка 2
ссылка 3
Dotless-i, является строчным «i» без точки. Верхний регистр этого символа – обычное «я». Есть еще один персонаж: «Я с точкой». В нижнем регистре этого символа находится обычный строчный «i».
Вы заметили проблему? Это несимметричное преобразование вызывает серьезную проблему при программировании. Мы сталкиваемся с этой проблемой в основном в приложениях Java из-за плохой реализации функций toLowerCase и toUpperCase (IMHO).
В Java метод String.toLowerCase () преобразует символы в нижний регистр в соответствии со стандартом по умолчанию. Это вызывает проблемы, если ваше приложение работает в турецком языке, и особенно если вы используете эту функцию для имени файла или URL-адреса, который должен подчиняться определенному набору символов.
Ранее я писал о двух серьезных примерах: ошибки компиляции с библиотеками скриптов с «i» в их именах и ошибка XSP Manager, если XPage находится в базе данных с именем «I» в его имени.
Как я уже говорил, существует долгая история. Например, в некоторых версиях R7 маршрутизатор не смог отправить сообщение получателю, если его имя начинается с «I». Агент сообщений не работал в турецком языке до R8. Любой пользователь с турецким языком не смог установить Lotus Notes 8.5.1 (это реально!). Список продолжается …
Из Турции почти нет бета-тестера, и клиенты не открывают PMR для этих проблем. Таким образом, эти проблемы не соответствуют первому приоритету для команд разработчиков.
Даже команда Java добавила специальное предупреждение к последней документации:
Этот метод чувствителен к локали и может давать неожиданные результаты, если они используются для строк, которые предназначены для интерпретации локали независимо. Примерами являются идентификаторы языка программирования, ключи протокола и tags HTML. Например, «TITLE» .toLowerCase () в турецком языке возвращает «tıtle», где «ı» – символ LATIN SMALL LETTER DOTLESS I. Чтобы получить правильные результаты для нечувствительных к языку строк, используйте toLowerCase (Locale.ENGLISH).
ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ССЫЛКИ, ЧТО Я НЕ МОГУ ПОЛУЧИТЬ ВСЕ ЭТО «ЭТО ОТВЕТ НА ВАШ КОММЕНТАРИЙ»
String str = "CyBeRdRaGoN"; str = str.toLowerCase(); // str = "cyberdragon" str = str.toUpperCase(); // str = "CYBERDRAGON"
Ваше приложение будет выбирать язык по умолчанию, поэтому, если кто-то запустит ваше приложение на турецком языке с турецким языком, он увидит, что i
без точки
Вы можете создать соответствующий язык для вашего языка String
.
Например:
toUpperCase(new Locale("tr","TR"));
сделает трюк для турецкого.
Если вы используете эту функцию для проверки строки (например, поиска) Безопасно использовать строки в строчной или прописной форме для проверки. Вы можете использовать его следующим образом:
if (mViewData.list.data[i].Name.toLowerCase(new Locale("tr", "TR")) .contains(mViewHolder.tctSearch.getText().toString().trim() .toLowerCase(new Locale("tr", "TR")))) { // your code here... }
Я сталкиваюсь с той же проблемой, но в случае поиска в списке. Я добавил этот ответ, который может помочь кому-то, у кого есть такая же проблема.