Использование локалей с помощью java toLowerCase() и toUpperCase()


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

я нашел метод, который идет что-то вроде этого:

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

теперь я прочитал, что с помощью некоторых Locales, как турецкий, " возвращает я (без точки) вместо Я (с точкой)."

безопасно ли использовать Locales как Великобритания, США, английский язык, etc.? Есть ли большие различия между ними, когда применяется к строкам?

, который является наиболее предпочтительным Locale на Strings?

4 52

4 ответа:

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

например, "название".toLowerCase () в турецкой локали возвращает "tıtle", где ' I ' - Латинская строчная буква без точки i. К получите правильные результаты для строк без учета локали, используйте toLowerCase (Locale.АНГЛИЙСКИЙ.)

я ссылаюсь на эти ссылки, как решение своей проблемы и это имеет смысл иметь в виду в вашей ситуации "Турецкий"

**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.Английский) и всегда переопределять локаль на английский язык. Но тогда вы не интернационализированы.

таким образом, затруднение, столоверчением() является локаль специфический.

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


Dotless-i, является строчной буквой " i " без точки. Заглавная буква этого символа-обычное "I". Есть еще один персонаж, "я с точкой". Нижний регистр этого символа-обычный нижний регистр "i".

вы заметили проблему? Это несимметричное преобразование вызывает серьезную проблему в программировании. Мы сталкиваемся с этой проблемой в основном в Java-приложениях из-за (IMHO) плохой реализации функций toLowerCase и toUpperCase.

В Java, Строки.метод toLowerCase () преобразует символы в нижний регистр в соответствии с языковым стандартом по умолчанию. Это вызывает проблемы, если ваше приложение работает в турецком языке и особенно если вы используете эту функцию для имени файла или url-адреса, который должен подчиняться определенному набору символов.

Я уже писал в блоге о двух серьезных примерах: скомпилируйте ошибки с библиотеками сценариев с "i "в их именах и ошибкой Xsp Manager, если XPage находится в базе данных с" I " в ее имени.

есть долгая история, как я уже сказал. Например, в некоторых версиях R7 маршрутизатор не смог отправить сообщение получателю, если его имя начинается с "I". Агенты отчетов о сообщениях не работали в турецком языке до R8. Любой человек с турецким языком не может установить Lotus Notes 8.5.1 (это реально!). Список можно продолжать...

там практически нет бета-тестера из Турции и клиенты не открывают ПМР для этих проблем. Так что эти проблемы не выходят на первый план для команд разработчиков.

даже команда Java добавила специальное предупреждение к последней документации:

этот метод чувствителен к локали и может привести к неожиданным результатам, если используется для строк, предназначенных для интерпретации языкового стандарта независимо. Примеры-идентификаторы языка программирования, протокол клавиши и тег HTML. Например, "титул".toLowerCase () на турецком языке locale возвращает "tıtle", где ' I ' - Латинская строчная буква без точек I характер. Чтобы получить правильные результаты для нечувствительных к языковому стандарту строк, используйте toLowerCase (Locale.АНГЛИЙСКИЙ.)

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

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

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