String.prototype.normalize()

Метод normalize() повертає рядок у формі нормалізації Юнікоду.

Синтаксис

str.normalize([form])

Параметри

form Optional

Одне зі значень "NFC", "NFD", "NFKC" або "NFKD", що вказують форму нормалізації Юнікоду. Якщо не вказана, або дорівнює undefined, використовується "NFC".

Ці значення означають наступне:

"NFC"
Канонічна декомпозиція, з подальшою канонічною композицією.
"NFD"
Канонічна декомпозиція.
"NFKC"
Сумісна декомпозиція, з подальшою канонічною композицією.
"NFKD"
Сумісна декомпозиція.

Значення, що повертається

Рядок, що містить форму нормалізації Юнікоду для наданого рядка.

Помилки

RangeError
Помилка RangeError викидається, якщо form не є одним з наведених вище значень.

Опис

Юнікод присвоює унікальне числове значення, яке називається кодом символа, кожному символу. Наприклад, кодом символа "A" є U+0041. Однак, іноді більше, ніж один код символа, або послідовність кодів, можуть представляти один і той самий абстрактний символ — наприклад, символ "ñ" може бути представлений:

  • Єдиним кодом символа U+00F1.
  • Кодом символа "n" (U+006E) з наступним кодом символа для об'єднуючої тильди (U+0303).
let string1 = '\u00F1';
let string2 = '\u006E\u0303';

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

Однак, оскільки коди символів відрізняються, порівняння рядків не вважатиме їх рівними. А оскільки кількість кодів символів у цих варіантах різна, то вони навіть мають різні довжини.

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

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

Метод normalize() допомагає вирішити цю проблему, перетворюючи рядок у нормалізовану форму, спільну для усіх послідовностей кодів символів, які представляють однакові символи. Існують дві основні форми нормалізації, одна базується на канонічній еквівалентності, а інша на сумісності.

Нормалізація на основі канонічної еквівалентності

В Юнікоді дві послідовності кодів символів канонічно еквівалентні, якщо вони відображають однакові абстрактні символи, і повинні завжди мати однакове візуальне відображення та поведінку (для прикладу, вони завжди повинні сортуватися однаковим чином).

Ви можете скористатись методом 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

Нормалізація на основі сумісності

В Юнікоді дві послідовності кодів символів є сумісними, якщо вони представляють однакові абстрактні символи, і мають сприйматися однаково у деяких — але не обов'язково в усіх — застосуваннях.

Усі канонічно еквівалентні послідовності також є сумісними, але не навпаки.

Наприклад:

  • код символа 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 <- візуальне відображення змінилось
console.log(string2);             // ff
console.log(string1 === string2); // true
console.log(string1.length);      // 2
console.log(string2.length);      // 2

Застосовуючи сумісну нормалізацію, важливо враховувати, що саме ви намагаєтесь зробити з рядками, оскільки нормалізована форма може не підходити для усіх застосувань. У наведеному вище прикладі нормалізація підходить для пошуку, бо дозволяє користувачу знайти рядок пошуком "f". Але вона може не підходити для відображення, бо зовнішній вигляд символа відрізняється.

Як і у випадку з канонічною нормалізацією, ви можете застосовувати розкладену або з'єднану форми, передаючи, відповідно, "NFKD" або "NFKC".

Приклади

Використання normalize()

// Початковий рядок

// U+1E9B: ЛАТИНСЬКА МАЛА ЛІТЕРА ДОВГА S З КРАПКОЮ ЗГОРИ
// U+0323: ОБ'ЄДНУЮЧА КРАПКА ВНИЗУ
let str = '\u1E9B\u0323';


// Канонічно-з'єднана форма (NFC)

// U+1E9B: ЛАТИНСЬКА МАЛА ЛІТЕРА ДОВГА S З КРАПКОЮ ЗГОРИ
// U+0323: ОБ'ЄДНУЮЧА КРАПКА ВНИЗУ
str.normalize('NFC'); // '\u1E9B\u0323'
str.normalize();      // такий самий


// Канонічно-розкладена форма (NFD)

// U+017F: ЛАТИНСЬКА МАЛА ЛІТЕРА ДОВГА S
// U+0323: ОБ'ЄДНУЮЧА КРАПКА ВНИЗУ
// U+0307: ОБ'ЄДНУЮЧА КРАПКА ЗГОРИ
str.normalize('NFD'); // '\u017F\u0323\u0307'


// Сумісно-з'єднана (NFKC)

// U+1E69: ЛАТИНСЬКА МАЛА ЛІТЕРА S З КРАПКОЮ ВНИЗУ ТА КРАПКОЮ ЗГОРИ
str.normalize('NFKC'); // '\u1E69'


// Сумісно-розкладена (NFKD)

// U+0073: ЛАТИНСЬКА МАЛА ЛІТЕРА S
// U+0323: ОБ'ЄДНУЮЧА КРАПКА ВНИЗУ
// U+0307: ОБ'ЄДНУЮЧА КРАПКА ЗГОРИ
str.normalize('NFKD'); // '\u0073\u0323\u0307'

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

Специфікація
ECMAScript (ECMA-262)
The definition of 'String.prototype.normalize' in that specification.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
normalizeChrome Full support 34Edge Full support 12Firefox Full support 31IE No support NoOpera Full support 21Safari Full support 10WebView Android No support NoChrome Android Full support 34Firefox Android Full support 31Opera Android Full support 21Safari iOS Full support 10Samsung Internet Android Full support 2.0nodejs Full support 0.12

Legend

Full support  
Full support
No support  
No support

Див. також