Spec-Zone.ru › JavaScript

String.prototype.normalize()

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2016 года.

Метод normalize() объектов String возвращает форму Unicode Normalization для этой строки.

Попробуйте

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

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

Синтаксис

normalize()
normalize(form)

Параметры

form Необязательный

Одна из "NFC", "NFD", "NFKC" или "NFKD", определяющая форму Unicode Normalization. Если пропущено или undefined, используется "NFC".

Эти значения имеют следующие значения:

"NFC"
Каноническое разложение с последующим каноническим составлением.
"NFD"
Каноническое разложение.
"NFKC"
Совместимое разложение с последующим каноническим составлением.
"NFKD"
Совместимое разложение.

Возвращаемое значение

Строка, содержащая форму Unicode Normalization для заданной строки.

Исключения

RangeError
Выбрасывается, если form не является одним из указанных выше значений.

Описание

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

  • Единой кодовой точкой U+00F1.
  • Кодовой точкой для "n" (U+006E), за которой следует кодовая точка для комбинируемого тильды (U+0303).
const string1 = "\u00F1";
const string2 = "\u006E\u0303";

console.log(string1); // ñ
console.log(string2); // ñ

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

const string1 = "\u00F1"; // ñ
const string2 = "\u006E\u0303"; // ñ

console.log(string1 === string2); // false
console.log(string1.length); // 1
console.log(string2.length); // 2

Метод normalize() помогает решить эту проблему, преобразуя строку в нормализованную форму, общую для всех последовательностей кодовых точек, представляющих одни и те же символы. Существует две основные формы нормализации: одна основана на канонической эквивалентности, а другая — на совместимости.

Нормализация канонической эквивалентности

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

Вы можете использовать normalize() с аргументами "NFD" или "NFC" для получения формы строки, которая будет одинаковой для всех канонически эквивалентных строк. В приведенном ниже примере мы нормализуем два представления символа "ñ":

let string1 = "\u00F1"; // ñ
let string2 = "\u006E\u0303"; // ñ

string1 = string1.normalize("NFD");
string2 = string2.normalize("NFD");

console.log(string1 === string2); // true
console.log(string1.length); // 2
console.log(string2.length); // 2

Составная и разложенная формы

Обратите внимание, что длина нормализованной формы при "NFD" составляет 2. Это потому, что "NFD" предоставляет разложенную версию канонической формы, в которой единичные кодовые точки разбиваются на несколько комбинируемых. Разложенная каноническая форма для "ñ" — это "\u006E\u0303".

Вы можете указать "NFC", чтобы получить составную каноническую форму, в которой несколько кодовых точек заменяются единичными кодовыми точками, где это возможно. Составная каноническая форма для "ñ" — это "\u00F1":

let string1 = "\u00F1"; // ñ
let string2 = "\u006E\u0303"; // ñ

string1 = string1.normalize("NFC");
string2 = string2.normalize("NFC");

console.log(string1 === string2); // true
console.log(string1.length); // 1
console.log(string2.length); // 1
console.log(string2.codePointAt(0).toString(16)); // f1

Нормализация совместимости

В Unicode две последовательности кодовых точек совместимы, если они представляют одни и те же абстрактные символы и должны рассматриваться одинаково в некоторых — но не обязательно во всех — приложениях.

Все канонически эквивалентные последовательности также совместимы, но не наоборот.

Например:

  • кодовая точка U+FB00 представляет лигатуру "ff". Она совместима с двумя последовательными кодовыми точками U+0066 ("ff").
  • кодовая точка U+24B9 представляет символ "Ⓓ". Она совместима с кодовой точкой U+0044 ("D").

В одних аспектах (например, сортировка) они должны рассматриваться как эквивалентные, а в других (например, визуальный вид) — нет, поэтому они не канонически эквивалентны.

Вы можете использовать normalize() с аргументами "NFKD" или "NFKC" для получения формы строки, которая будет одинаковой для всех совместимых строк:

let string1 = "\uFB00";
let string2 = "\u0066\u0066";

console.log(string1); // ff
console.log(string2); // ff
console.log(string1 === string2); // false
console.log(string1.length); // 1
console.log(string2.length); // 2

string1 = string1.normalize("NFKD");
string2 = string2.normalize("NFKD");

console.log(string1); // ff <- visual appearance changed
console.log(string2); // ff
console.log(string1 === string2); // true
console.log(string1.length); // 2
console.log(string2.length); // 2

При применении нормализации совместимости важно учитывать, что вы собираетесь делать со строками, поскольку нормализованная форма может быть непригодна для всех приложений. В приведенном выше примере нормализация подходит для поиска, поскольку она позволяет пользователю найти строку, выполнив поиск по "f". Но она может быть непригодной для отображения, поскольку визуальное представление отличается.

Как и при канонической нормализации, вы можете запросить разложенные или составные совместимые формы, передав "NFKD" или "NFKC" соответственно.

Примеры

Использование normalize()

// Initial string

// U+1E9B: LATIN SMALL LETTER LONG S WITH DOT ABOVE
// U+0323: COMBINING DOT BELOW
const str = "\u1E9B\u0323";

// Canonically-composed form (NFC)

// U+1E9B: LATIN SMALL LETTER LONG S WITH DOT ABOVE
// U+0323: COMBINING DOT BELOW
str.normalize("NFC"); // '\u1E9B\u0323'
str.normalize(); // same as above

// Canonically-decomposed form (NFD)

// U+017F: LATIN SMALL LETTER LONG S
// U+0323: COMBINING DOT BELOW
// U+0307: COMBINING DOT ABOVE
str.normalize("NFD"); // '\u017F\u0323\u0307'

// Compatibly-composed (NFKC)

// U+1E69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
str.normalize("NFKC"); // '\u1E69'

// Compatibly-decomposed (NFKD)

// U+0073: LATIN SMALL LETTER S
// U+0323: COMBINING DOT BELOW
// U+0307: COMBINING DOT ABOVE
str.normalize("NFKD"); // '\u0073\u0323\u0307'

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-string.prototype.normalize

Совместимость с браузерами

Настольные компьютеры Мобильные устройства Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android WebView на iOS Bun Deno Node.js
normalize
34
12
31
21
10
34
31
21
10
2.0
37
10
1.0.0
1.0
0.12.0

См. также

  • Приложение Unicode № 15, Формы нормализации Unicode
  • Эквивалентность Unicode в Википедии

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API