Метод normalize()
приводит строки к единой форме Unicode. Это нужно, когда один символ (например, буква с акцентом) записан по-разному, но должен обрабатываться одинаково. Метод доступен с 20 марта 2019 года (статус Baseline «Widely Available»).
Пример: буква «é» может быть единой или комбинацией «e» и «́». normalize()
делает их одинаковыми для сравнения.
const str1 = 'e\u0301'; // «e» + акцент
const str2 = 'é'; // единая «é»
console.log(str1 === str2); // false
console.log(str1.normalize() === str2.normalize()); // true
Получается, в Unicode один символ может быть записан разными способами, что мешает при сравнении строк, поиске или сортировке. normalize()
решает эту проблему, приводя строку к стандартной форме.
Как работает?
Метод принимает параметр — форму нормализации. Основные формы:
- NFC (по умолчанию): объединяет символы (например, «e» + «́» → «é»).
- NFD: разбивает символы на части (например, «é» → «e» + «́»).
- NFKC: как NFC, но упрощает, заменяя сложные символы (например, «fi» → «fi»).
- NFKD: как NFD, но с упрощением.
Пример с разными формами:
const str = 'é';
console.log(str.normalize('NFC')); // «é» (единый символ)
console.log(str.normalize('NFD')); // «e» + «́» (разложенный)
Практические примеры
1. Сравнение строк
При поиске в форме игнорируем различия в написании:
const userInput = 'café';
const dbValue = 'cafe\u0301';
if (userInput.normalize() === dbValue.normalize()) {
console.log('Строки совпадают!');
}
2. Сортировка
Для корректной сортировки имен с диакритиками:
const names = ['José', 'Jose\u0301', 'Jòse'];
const sorted = names.sort((a, b) => a.normalize().localeCompare(b.normalize()));
console.log(sorted); // ['José', 'José', 'Jòse'] в правильном порядке
3. Работа с эмодзи
Эмодзи тоже могут иметь разные представления:
const emoji1 = '\uD83D\uDE00'; // ????
const emoji2 = '\uD83D\uDE00\uFE0F'; // ???? с вариацией
console.log(emoji1.normalize() === emoji2.normalize()); // true
Ограничения
- Не все символы нормализуются одинаково в разных браузерах.
- Требует понимания Unicode и форм нормализации.
- Может слегка замедлить обработку больших строк.
Заключение
normalize()
— полезный метод для работы с текстом в JavaScript, особенно в приложениях с поддержкой разных языков. Он упрощает сравнение и обработку строк, устраняя различия в кодировке Unicode.