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

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

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

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

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

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

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

4 ответов


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

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

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

**FROM THE LINKS**

столоверчением() уважает интернационализации (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. Да длина строки перед и после дела преобразования различных. Твоя логика пойдет ко дну. когда вы зависите от длины строки в этом сценарии. Когда ваша программа выполняется в другой среде, может произойти сбой. Это будет хороший улов в обзоре кода.

чтобы сделать его более безопасным, вы можете использовать другой метод столоверчением(Локаль.English)и всегда переопределять локаль на английский. Но тогда вы не интернационализированы.

Итак, суть в том, что toLowerCase() является locale специфический.

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


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

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

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

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

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

там почти нет бета-тестера из Турции, и клиенты не открывают PMR для этих проблем. Таким образом, эти проблемы не поднимаются до первого приоритета для команд разработчиков.

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

этот метод чувствителен к локали и может привести к неожиданным результатам, если используется для строк, предназначенных для интерпретации locale независимо. Примерами являются идентификаторы языков программирования, протокол клавиши и тег HTML. Например, "название".toLowerCase () на турецком языке locale возвращает "tıtle", где " I " - Латинская маленькая буква DOTLESS I характер. Чтобы получить правильные результаты для locale insensitive strings, используйте 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. Я добавил этот ответ, что он может помочь кому-то, у кого такая же проблема.