normalize() приводит строку к Unicode-нормальной форме.
Это нужно в ситуациях, когда две строки выглядят одинаково, но внутри состоят из разных Unicode-символов и поэтому могут не совпадать при сравнении.
Синтаксис
str.normalize()
str.normalize(form)
Метод вызывается у строки и возвращает новую строку.
По умолчанию используется форма NFC.
Зачем нужен normalize()
Иногда один и тот же символ можно записать по-разному.
Например, буква é может быть:
- одним символом
- буквой
eи отдельным знаком ударения
Визуально строки будут одинаковыми, но обычное сравнение может вернуть false.
const a = "é";
const b = "e\u0301";
console.log(a === b); // false
После normalize() строки можно привести к одной форме:
const a = "é";
const b = "e\u0301";
console.log(a.normalize() === b.normalize()); // true
Как работает normalize()
const text = "e\u0301";
const result = text.normalize();
console.log(result); // "é"
Обычно normalize() используют перед сравнением, поиском или сохранением текста.
Исходная строка не меняется
Строки в JavaScript неизменяемы, поэтому normalize() не меняет исходное значение, а возвращает новую строку.
const text = "e\u0301";
const normalized = text.normalize();
console.log(text); // "é"
console.log(normalized); // "é"
Формы нормализации
У normalize() есть несколько форм:
NFCNFDNFKCNFKD
На практике чаще всего используют NFC, потому что это стандартный и безопасный вариант для обычного текста.
const text = "e\u0301";
console.log(text.normalize("NFC"));
console.log(text.normalize("NFD"));
Если форму не передавать, будет использована NFC.
console.log("e\u0301".normalize() === "e\u0301".normalize("NFC")); // true
Когда это полезно
normalize() удобно использовать, когда:
- нужно корректно сравнить строки с Unicode-символами
- текст приходит из разных источников
- важно, чтобы поиск работал одинаково для визуально одинаковых строк
Пример:
const stored = "café";
const input = "cafe\u0301";
console.log(stored === input); // false
console.log(stored.normalize() === input.normalize()); // true
normalize() и сравнение строк
Без нормализации визуально одинаковые строки могут не совпасть:
const a = "mañana";
const b = "man\u0303ana";
console.log(a === b); // false
С нормализацией сравнение становится надёжнее:
console.log(a.normalize() === b.normalize()); // true
Частые ошибки
Думать, что normalize() нужен для любого текста
Для обычных ASCII-строк вроде "hello" разницы обычно не будет.
console.log("hello".normalize()); // "hello"
Этот метод нужен в первую очередь для Unicode-символов, которые можно представить разными способами.
Передавать неверную форму
Если передать неизвестную форму, JavaScript выбросит ошибку.
// "text".normalize("ABC"); // RangeError
Использовать можно только NFC, NFD, NFKC и NFKD.
Быстрая памятка
normalize()приводит строку к Unicode-нормальной форме- метод возвращает новую строку
- исходная строка не меняется
- по умолчанию используется форма
NFC - полезен для корректного сравнения визуально одинаковых строк
Коротко
normalize() - это метод строки в JavaScript, который помогает привести Unicode-текст к единой форме. Чаще всего его используют перед сравнением и поиском, когда строки могут выглядеть одинаково, но храниться по-разному.