Использование локалей с помощью java toLowerCase() и toUpperCase()
Я хотел код для преобразования всех символов в строках в верхний или нижний регистр в Java.
я нашел метод, который идет что-то вроде этого:
public static String changelowertoupper()
{
String str = "CyBeRdRaGoN";
str=str.toLowerCase(Locale.ENGLISH);
return str;
}
теперь я прочитал, что с помощью некоторых Locale
s, как турецкий, " возвращает я (без точки) вместо Я (с точкой)."
безопасно ли использовать Locale
s как Великобритания, США, английский язык, etc.? Есть ли большие различия между ними, когда применяется к строкам?
, который является наиболее предпочтительным Locale
на String
s?
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.Английский) и всегда переопределять локаль на английский язык. Но тогда вы не интернационализированы.
таким образом, затруднение, столоверчением() является локаль специфический.
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. Я добавил этот ответ, что это может помочь кому-то, у кого есть такая же проблема.