Подтвердить что ты не робот

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

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

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

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

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

Можно ли использовать Locale как UK, US, ENGLISH и т.д.? Существуют ли большие различия между ними при применении к строкам?

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

4b9b3361

Ответ 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() специфична для локали.

ссылка 1
ссылка 2
ссылка 3


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).

ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ССЫЛКИ, ЧТО Я НЕ МОГУ ПОЛУЧИТЬ ВСЕ ЭТОГО "ЭТО ОТВЕТ НА ВАШ КОММЕНТАРИЙ"

Ответ 2

Вы можете создать соответствующий язык для вашего языка String.

Например:

toUpperCase(new Locale("tr","TR"));

сделает трюк для турецкого.

Ответ 3

String str = "CyBeRdRaGoN";

str = str.toLowerCase(); // str = "cyberdragon"

str = str.toUpperCase(); // str = "CYBERDRAGON"

Ваше приложение будет выбирать язык по умолчанию, поэтому, если кто-то запустит ваше приложение на турецком языке с турецким языком, он увидит i без точки

Ответ 4

Если вы используете эту функцию для проверки строки (например, поиска) Безопасно использовать строки в строчной или прописной форме для проверки. Вы можете использовать его следующим образом:

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...
}

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

Ответ 5

В котлине

private fun changelowertoupper(): String {
        val str = "CyBeRdRaGoN"
        return str.toLowerCase(Locale.ROOT) // or Locale.getDefault()
    }