encodeURIComponent()
Функція encodeURIComponent() (закодувати компонент URI) кодує URI шляхом заміни кожного входження певних символів однією, двома, трьома або чотирма послідовностями екранування, що представляють кодування символу в UTF-8 (чотири послідовності будуть лише для символів, що складаються з двох сурогатних символів). Порівняно з encodeURI(), ця функція кодує більше символів, включно з тими, котрі є частиною синтаксису URI.
Спробуйте його в дії
Синтаксис
encodeURIComponent(uriComponent)
Параметри
uriComponentРядок для кодування як компонента URI (шляху, рядка запиту, фрагмента тощо). Інші значення – перетворюються на рядки.
Повернене значення
Новий рядок, що представляє uriComponent, закодований як компонент URI.
Винятки
URIErrorВикидається, коли
uriComponentмістить самотній сурогат.
Опис
encodeURIComponent() – це функція, що є властивістю глобального об'єкта.
encodeURIComponent() використовує такий же алгоритм кодування, як описаний для encodeURI(). Він екранує усі символи, окрім:
A–Z a–z 0–9 - _ . ! ~ * ' ( )
Порівняно з encodeURI(), encodeURIComponent() екранує більшу множину символів. Функцію encodeURIComponent() слід застосовувати на введених користувачем полях форм, що надсилаються на сервер за допомогою POST: вона екранує символи &, що можуть ненавмисно бути додані при введенні даних символьних посилань, та інші символи, що вимагають кодування й розкодування. Наприклад, якщо користувач напише Jack & Jill, то без encodeURIComponent() амперсанд може бути розтлумачений сервером як початок нового поля й поставити під загрозу цілісність даних.
Для application/x-www-form-urlencoded (англ.) пробіли треба замінювати +, тож одним з варіантів – після перетворення encodeURIComponent() провести додаткову заміну %20 на +.
Приклади
Кодування для заголовків Content-Disposition і Link
Наступний приклад демонструє особливе кодування, що вимагається в параметрах заголовків відповідей сервера Content-Disposition і Link в UTF-8 (наприклад, імена файлів у UTF-8):
const fileName = "my file(2).txt";
const header = `Content-Disposition: attachment; filename*=UTF-8''${encodeRFC5987ValueChars(
fileName,
)}`;
console.log(header);
// "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"
function encodeRFC5987ValueChars(str) {
return (
encodeURIComponent(str)
// Рядок нижче утворює послідовності %27 %28 %29 %2A (Зверніть увагу, що
// дійсне кодування "*" – це %2A, з чого випливає потреба викликати
// toUpperCase() для коректного кодування). І хоча RFC3986 резервує "!",
// RFC5987 – ні, тому цей символ немає потреби екранувати.
.replace(
/['()*]/g,
(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,
)
// Наступне не обов'язково для процентного кодування згідно з RFC5987,
// тож можна дозволити трохи кращу прочитність по той бік дроту: |`^
.replace(/%(7C|60|5E)/g, (str, hex) =>
String.fromCharCode(parseInt(hex, 16)),
)
);
}
Кодування для RFC3986
Новіший стандарт RFC3986 резервує !, ', (, ) і *, навіть попри те, що ці символи не мають формалізованого використання як обмежувачі в URI. Наступна функція кодує рядок у сумісному з RFC3986 форматі компонента URL. Також вона кодує [ і ], котрі є частиною синтаксису URI IPv6. Сумісна з RFC3986 реалізація encodeURI їх екранувати не повинна, що продемонстровано в прикладі encodeURI().
function encodeRFC3986URIComponent(str) {
return encodeURIComponent(str).replace(
/[!'()*]/g,
(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,
);
}
Кодування самотнього сурогату викидає помилку
Викидається помилка URIError, якщо спробувати закодувати сурогат, який не є частиною пари старшого та молодшого сурогатів. Наприклад:
// Пара старший-молодший – ОК
encodeURIComponent("\uD800\uDFFF"); // "%F0%90%8F%BF"
// Самотня старшосурогатна кодова одиниця викидає помилку "URIError: malformed URI sequence"
encodeURIComponent("\uD800");
// Самотня старшосурогатна кодова одиниця викидає помилку "URIError: malformed URI sequence"
encodeURIComponent("\uDFFF");
Можна скористатися методом String.prototype.toWellFormed(), котрий замінює самотні сурогати на символ заміни Unicode (U+FFFD), щоб уникнути цієї помилки. Також можна скористатися методом String.prototype.isWellFormed(), щоб перевірити, чи містить рядок самотні сурогати, перед тим, як передати його в encodeURIComponent().
Специфікації
Сумісність із браузерами
| desktop | mobile | server | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
encodeURIComponent
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 7 | Safari Full support 1.1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |