Learn JavaScript

normalize() - метод для Unicode-нормализации строки в JavaScript

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() есть несколько форм:

  • NFC
  • NFD
  • NFKC
  • NFKD

На практике чаще всего используют 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-текст к единой форме. Чаще всего его используют перед сравнением и поиском, когда строки могут выглядеть одинаково, но храниться по-разному.