Для международного веб-сайта нам может потребоваться обработка разных языков, в некоторых случаях пользователю может потребоваться вводить данные на своем языке, мы не можем контролировать то, что они печатают, они могут злонамеренно или случайно ввести что-то, чего мы не ожидаем.

Один известный пример:

const name1 = '\u0041\u006d\u00e9\u006c\u0069\u0065';
const name2 = '\u0041\u006d\u0065\u0301\u006c\u0069\u0065';
console.log(`${name1}, ${name2}`);
// expected output: "Amélie, Amélie"
console.log(name1 === name2);
// expected output: false
console.log(name1.length === name2.length);
// expected output: false

Мы не можем увидеть никаких различий глазами, они выглядят одинаково, но они разные, очень странные.

Вот причина:

Unicode присваивает уникальное числовое значение, называемое кодовой точкой, каждому символу. Например, кодовая точка для "A" задается как U+0041. Однако иногда более одной кодовой точки или последовательности кодовых точек могут представлять один и тот же абстрактный символ — например, символ "ñ" может быть представлен одним из:

Единая кодовая точка U+00F1.

Кодовая точка для "n" (U+006E), за которой следует кодовая точка для тильды объединения (U+0303).

Как это исправить?

Используя normalize() , он вернет форму нормализации Unicode строки.

const name1NFC = name1.normalize('NFC');
const name2NFC = name2.normalize('NFC');
console.log(`${name1NFC}, ${name2NFC}`);
// expected output: "Amélie, Amélie"
console.log(name1NFC === name2NFC);
// expected output: true
console.log(name1NFC.length === name2NFC.length);
// expected output: true

Почему это важно?

Из приведенного выше примера видно, что длина двух одинаковых строк может иметь две разные длины, и проверка длины не пройдет.

Кроме того, представьте, что пользователь регистрирует имя пользователя, которое было занято, пользователь может использовать этот трюк, чтобы обойти проверку.

Поэтому мы должны нормализовать строку, прежде чем выполнять какие-либо проверки.