Spec-Zone.ru › JavaScript

encodeURIComponent()

Базовая Широко доступно

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

Функция encodeURIComponent() кодирует URI, заменяя каждую встреченную из определенных символов одной, двумя, тремя или четырьмя управляющими последовательностями, представляющими UTF-8 кодировку символа (четыре управляющие последовательности будут только для символов, состоящих из двух суррогатных символов). По сравнению с encodeURI(), эта функция кодирует больше символов, включая те, которые являются частью синтаксиса URI.

Попробуйте

// Encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent("test?")}`);
// Expected output: "?x=test%3F"

console.log(`?x=${encodeURIComponent("шеллы")}`);
// Expected output: "?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"

Синтаксис

encodeURIComponent(uriComponent)

Параметры

uriComponent
Строка для кодирования в компоненте URI (путь, строка запроса, фрагмент и т. д.). Другие значения преобразуются в строки.

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

Новая строка, представляющая предоставленный uriComponent, закодированный как компонент URI.

Исключения

URIError
Выбрасывается, если uriComponent содержит одиночный суррогат.

Описание

encodeURIComponent() — это свойство функции глобального объекта.

encodeURIComponent() использует тот же алгоритм кодирования, что описан в encodeURI(). Он экранирует все символы, кроме:

A–Z a–z 0–9 - _ . ! ~ * ' ( )

По сравнению с encodeURI(), encodeURIComponent() экранирует больший набор символов. Используйте encodeURIComponent() для полей, вводимых пользователем, из форм, отправляемых на сервер — это будет кодировать символы &, которые могут быть случайно сгенерированы во время ввода данных для ссылок на символы или других символов, требующих кодирования/декодирования. Например, если пользователь вводит Jack & Jill, без encodeURIComponent(), амперсанд может быть интерпретирован на сервере как начало нового поля и поставить под угрозу целостность данных.

Для application/x-www-form-urlencoded пробелы должны заменяться на +, поэтому после замены encodeURIComponent() может потребоваться дополнительная замена %20 на +.

Примеры

Кодирование для заголовков Content-Disposition и Link

Следующий пример предоставляет специальное кодирование, необходимое в параметрах заголовков ответа сервера UTF-8 Content-Disposition и Link (например, имена файлов в 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)
      // The following creates the sequences %27 %28 %29 %2A (Note that
      // the valid encoding of "*" is %2A, which necessitates calling
      // toUpperCase() to properly encode). Although RFC3986 reserves "!",
      // RFC5987 does not, so we do not need to escape it.
      .replace(
        /['()*]/g,
        (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,
      )
      // The following are not required for percent-encoding per RFC5987,
      // so we can allow for a little better readability over the wire: |`^
      .replace(/%(7C|60|5E)/g, (str, hex) =>
        String.fromCharCode(parseInt(hex, 16)),
      )
  );
}

Кодирование для RFC3986

Более новый RFC3986 резервирует !, ', (, ) и *, хотя эти символы не имеют формализованных использований в качестве разделителей URI. Следующая функция кодирует строку для формата компонента URL, соответствующего RFC3986. Она также кодирует [ и ], которые являются частью синтаксиса URI IPv6. Реализация encodeURI, соответствующая RFC3986, не должна их экранировать, что демонстрируется в примере encodeURI().

function encodeRFC3986URIComponent(str) {
  return encodeURIComponent(str).replace(
    /[!'()*]/g,
    (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,
  );
}

Кодирование одиночного суррогата вызывает ошибку

URIError будет выброшено, если будет предпринята попытка закодировать суррогат, не являющийся частью пары высокий-низкий. Например:

// High-low pair OK
encodeURIComponent("\uD800\uDFFF"); // "%F0%90%8F%BF"

// Lone high-surrogate code unit throws "URIError: malformed URI sequence"
encodeURIComponent("\uD800");

// Lone high-surrogate code unit throws "URIError: malformed URI sequence"
encodeURIComponent("\uDFFF");

Вы можете использовать String.prototype.toWellFormed(), которая заменяет одиночные суррогаты на символ замены Unicode (U+FFFD), чтобы избежать этой ошибки. Вы также можете использовать String.prototype.isWellFormed() для проверки наличия одиночных суррогатов в строке перед передачей ее в encodeURIComponent().

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

Спецификация
Спецификация языка ECMAScript® 2027
# sec-encodeuricomponent-uricomponent

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

Настольные компьютеры Мобильные устройства Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android WebView на iOS Bun Deno Node.js
encodeURIComponent
1
12
1
7
1.1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • decodeURI()
  • encodeURI()
  • decodeURIComponent()

© 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/encodeURIComponent

Spec-Zone.ru

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