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