Использование локалей с Java toLowerCase () и toUpperCase ()

Мне нужен код для преобразования всех символов в строках в верхний или нижний регистр на Java.

Я нашел метод, который выглядит примерно так:

public static String changelowertoupper() { String str = "CyBeRdRaGoN"; str=str.toLowerCase(Locale.ENGLISH); return str; } 

Теперь я прочитал, что с использованием определенных Locale s, таких как турецкий, «возвращает i (без точки) вместо i (с точкой) ».

Безопасно ли использовать Locale такие как Великобритания, США, АНГЛИЙСКИЙ и т. Д.? Существуют ли большие различия между ними при применении к строкам?

Какой из наиболее предпочтительных Locale для String ?

Я думаю, вы должны использовать язык,

Например, «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... } 

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

  • intern () ведет себя по-разному в Java 6 и Java 7
  • Как создать случайную буквенно-цифровую строку?
  • Лучший способ разделить строку на строки
  • Строковый вывод: формат или concat в C #?
  • Определите, является ли String целым числом в Java
  • Разница между строкой replace () и replaceAll ()
  • Как избавиться от `устаревшего преобразования из строковой константы в 'char *' 'предупреждения в GCC?
  • Каков наилучший способ преобразования между char * и System :: String в C ++ / CLI
  • Преобразование целых чисел в строки для создания выходных имен файлов во время выполнения
  • Как сравнить строки в Java?
  • Как заменить несколько пробелов одним пробелом
  • Interesting Posts

    Clonezilla диск для клонирования диска на двойной загрузке ubuntu karmic & XP setup – невозможно открыть '/boot/grub/device.map'

    Попробуйте использовать Window.FEATURE_CUSTOM_TITLE, но получило исключение: вы не можете комбинировать собственные заголовки с другими функциями названия.

    this.Visible не работает в Windows Forms

    Частичное совпадение аргумента функции

    Как подготовить выпуск версии с SystemJS и Gulp?

    Android эмулятор замораживания OS X v10.9 (Mavericks) с HAXM

    Как я могу проверить наличие фильтра действий с аргументами конструктора?

    Какая наименее противоречивая префикс / escape-последовательность для экрана или tmux?

    SSH для виртуальной машины Vmware с сетью NAT

    Часовой пояс с рельсами 3

    Как найти, где в Windows 7 отображается сетевой диск?

    Алгоритм добавления смешанного цвета для значений RGB

    Как я могу сделать только одну страницу документа Word горизонтальной?

    Как работает String.Index в Swift

    Полная трассировка стека Xcode

    Давайте будем гением компьютера.