String.toLowerCase: примеры (JAVA)
String.toLowerCase: StringОписание метода
Метод класса String toLowerCase выполняет преобразование всех символов строки в строчные формы в соответствии с правилами Unicode и выбранной локалью. Применяется при подготовке текста к поиску и сравнению без учета регистра, при нормализации идентификаторов, формировании URL-путей и при отображении данных с требованием нижнего регистра.
В Java доступны две перегрузки:
String toLowerCase()- используется локаль по умолчанию JVM (Locale.getDefault()).String toLowerCase(Locale locale)- применяется явная локаль, что важно для языков с особой семантикой преобразования регистра (например, турецкий).
Поведение и возвращаемые значения:
- Метод возвращает новую строку с преобразованными символами. Исходная строка остается без изменений, так как
Stringнеизменяем. - Если строка не содержит символов, для которых есть изменение регистра, возвращается строка, равная исходной (в реализации возможна оптимизация и возврат той же самой ссылки).
- Если в качестве аргумента передана
null(в перегрузке с локалью), будет выброшеноNullPointerException. - Преобразование учитывает правила Unicode, включая некоторые контекстно-зависимые отображения (например, греческая сигма), и локаль-специфические правила (например, для турецкого).
- Результат зависит от версии Unicode, реализованной в конкретной версии JDK. Обновления JDK могут менять отдельные соответствия регистра в соответствии с обновлениями стандарта Unicode.
Рекомендации
Для независимых от локали операций (идентификаторы, ключи, протоколы) предпочтительнее использовать toLowerCase(Locale.ROOT) или Locale.ENGLISH, чтобы избежать неожиданных локаль-специфичных преобразований. Для отображения текста пользователю - указывать локаль, соответствующую пользовательскому окружению.
Короткие примеры
Пример 1. Простой вызов без указания локали
String s = "Hello WORLD";
System.out.println(s.toLowerCase());
hello world
Пример 2. Явная локаль и отличие для турецкого
String s = "TITLE I";
System.out.println(s.toLowerCase(Locale.ENGLISH));
System.out.println(s.toLowerCase(new Locale("tr")));
title i title ı
Пример 3. Рекомендованный вариант для нормализации ключей
String key = "UserName";
String normalized = key.toLowerCase(Locale.ROOT);
System.out.println(normalized);
username
Пример 4. NullPointerException при null
String s = null;
s.toLowerCase(); // вызовет исключение
Exception in thread "main" java.lang.NullPointerException
at ...
Похожие функции в Java
- toUpperCase() - противоположная операция: перевод всех символов в заглавные, также имеет перегрузку с
Locale. - Character.toLowerCase(int codePoint) - понижение регистра для отдельного кода символа (подходит при работе с кодовыми точками и суррогатными парами).
- String.equalsIgnoreCase() - сравнение строк без учета регистра; работает для быстрых сравнений, но не всегда заменяет явную нормализацию при сложных правилах локалей.
- Collator (java.text.Collator) - предпочтительнее при локаль-специфичной сортировке и сравнении, так как учитывает языковые правила порядка и диакритики.
Выбор зависит от задачи: для преобразования текста под хранение или ключи - toLowerCase(Locale.ROOT). Для пользовательского отображения - toLowerCase(userLocale). Для сортировки и логического сравнения локаль-зависимого текста - Collator.
Эквиваленты в других языках
PHP
// однобайтовая версия (работает некорректно с UTF-8)
$str = strtolower('ПрИмер');
// многобайтовая версия
$str2 = mb_strtolower('ПрИмер', 'UTF-8');
echo $str2;
пример
mb_strtolower учитывает кодировку, но поведение по локали ограничено. Для турецких особенностей может потребоваться установка локали или специальная обработка.
JavaScript
console.log('Hello WORLD'.toLowerCase());
console.log('I'.toLowerCase());
console.log('I'.toLocaleLowerCase('tr'));
hello world i ı
toLocaleLowerCase поддерживает локаль и в браузерах, и в Node, но детали зависят от реализации.
Python
print('Hello WORLD'.lower())
print('İ'.lower())
print('Straße'.casefold())
hello world i̇ strasse
В Python рекомендуется casefold() для сравнения без учета регистра, так как оно выполняет более агрессивную нормализацию (например, для немецкого ß).
SQL
SELECT LOWER('Hello WORLD');
hello world
Поведение зависит от СУБД и ее настройке локали и сортировки.
C#
Console.WriteLine("Hello WORLD".ToLower());
Console.WriteLine("Hello WORLD".ToLowerInvariant());
hello world hello world
В C# есть явная версия ToLowerInvariant() для локаль-независимого результата.
Go
import "strings"
fmt.Println(strings.ToLower("Hello WORLD"))
hello world
Стандартная функция учитывает Unicode-ответвления, но для языко-специфичных правил доступны пакеты x/text.
Kotlin
println("Hello WORLD".lowercase())
println("Hello WORLD".lowercase(Locale.getDefault()))
hello world hello world
В новых версиях Kotlin используются функции lowercase() и uppercase(). Есть перегрузки с локалью.
Lua
print(string.lower('Hello WORLD'))
hello world
В Lua функция обычно опирается на локаль C и не заботится о UTF-8, поэтому для многобайтовых строк требуется дополнительная библиотека.
Типичные ошибки и ловушки
- NullPointerException: попытка вызвать метод на
null. Пример ниже. - Пренебрежение локалью: использование версии без аргумента может привести к неожиданному результату для турецкого и некоторых других языков.
- Ожидание мутации строки: String неизменяем, метод возвращает новую строку.
- Неполная нормализация: toLowerCase не удаляет диакритики; для сравнения следует дополнительно применять нормализацию Unicode и/или удаление знаков диакритики.
- Неправильный выбор для сравнения: для языко-зависимого сравнения и сортировки предпочтительнее использовать
Collator, а не простую нормализацию регистра. - Производительность: частые вызовы в горячем цикле создают много объектов. При большом объеме возможны оптимизации через кэширование или работу с байтовыми представлениями.
Пример NullPointerException
String s = null;
System.out.println(s.toLowerCase());
Exception in thread "main" java.lang.NullPointerException
at ...
Изменения в поведении
Сам механизм String.toLowerCase не претерпел радикальных изменений в Java, но результаты могут меняться при обновлениях JDK, поскольку соответствия регистра основаны на версии Unicode, включенной в конкретный релиз JDK. Обновления Unicode приводят к обновлению таблиц соответствий, что может изменить редкие преобразования.
В иных JVM-платформах или в сторонних библиотеках могут появляться функции с расширенной поддержкой локалей или более «полной» нормализацией (case folding). В Kotlin отмечена смена API: рекомендованы функции lowercase() и uppercase() вместо устаревших toLowerCase() и toUpperCase() без локали.
Расширенные примеры и нестандартные сценарии
1. Преобразование для формирования «чистой» ссылки (slug)
import java.text.Normalizer;
import java.util.Locale;
String s = "Đặng Văn Lâm";
String slug = Normalizer.normalize(s, Normalizer.Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
.toLowerCase(Locale.ROOT)
.replaceAll("[^a-z0-9]+", "-")
.replaceAll("(^-|-$)", "");
System.out.println(slug);
dang-van-lam
Нормализация и удаление диакритики помогают получить читаемые URL. Используется Locale.ROOT для предсказуемого результата.
2. Учёт турецкой локали и явная обработка символа I
String en = "I";
String tr = en.toLowerCase(new Locale("tr"));
System.out.println(tr + " (unicode: " + (int)tr.charAt(0) + ")");
ı (unicode: 305)
В турецкой локали латинская заглавная I без точки преобразуется в точечно-не содержащую строчную 'ı' (U+0131). Для операций с идентификаторами это влияет на совместимость.
3. Сравнение строк без учета регистра: toLowerCase vs Collator
String a = "straße";
String b = "STRASSE";
// Низкоуровневое сравнение через нормализацию
boolean eq1 = a.toLowerCase(Locale.ROOT).equals(b.toLowerCase(Locale.ROOT));
// Для локаль-специфичных правил лучше Collator (пример упрощен)
System.out.println(eq1);
false
В данном случае лучше применять специальные операции сравнения или использовать приведение к форме casefold (в Java отсутствует встроенное casefold, поэтому следует учитывать требования локали и применять дополнительные трансформации).
4. Понижение регистра по кодовым точкам и работа с суррогатами
String s = "????????????????????????????"; // некоторые редкие символы могут быть представлены как суррогатные пары
String lower = s.toLowerCase(Locale.ROOT);
System.out.println(lower);
???????????????????????????? эквивалент в нижнем регистре (в зависимости от символов)
При необходимости обработки отдельных кодовых точек следует применять Character.toLowerCase(int) и обход по codePoint.
5. Массовая обработка коллекции с учётом локали
List names = Arrays.asList("ALICE", "BOB", "İBRAHİM");
List lower = names.stream()
.map(s -> s.toLowerCase(Locale.forLanguageTag("tr")))
.collect(Collectors.toList());
lower.forEach(System.out::println);
alice bob ibrahim (с учётом турецких правил)
6. Использование Collator для сортировки вместо toLowerCase
Collator coll = Collator.getInstance(Locale.GERMAN);
coll.setStrength(Collator.PRIMARY);
List items = Arrays.asList("ä", "a", "z");
items.sort(coll);
System.out.println(items);
[a, ä, z] (порядок зависит от локали)
Collator учитывает локальные правила сортировки и диакритики, что часто предпочтительнее простого приведения регистра.