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'
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
См. также
© 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