Метод 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.