encodeURI()
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Функция encodeURI() кодирует URI, заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя экранирующими последовательностями, представляющими UTF-8 кодировку символа (будет четыре экранирующие последовательности только для символов, состоящих из двух суррогатных символов). По сравнению с encodeURIComponent(), эта функция кодирует меньше символов, сохраняя те, которые являются частью синтаксиса URI.
Попробуйте
const uri = "https://mozilla.org/?x=шеллы";
const encoded = encodeURI(uri);
console.log(encoded);
// Expected output: "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"
try {
console.log(decodeURI(encoded));
// Expected output: "https://mozilla.org/?x=шеллы"
} catch (e) {
// Catches a malformed URI
console.error(e);
}
Синтаксис
encodeURI(uri)
Параметры
-
uri - Строка, которая будет закодирована как URI.
Возвращаемое значение
Новая строка, представляющая предоставленную строку, закодированную как URI.
Исключения
-
URIError - Выбрасывается, если
uriсодержит одиночный суррогат.
Описание
encodeURI() является свойством-функцией глобального объекта.
Функция encodeURI() экранирует символы с помощью кодовых единиц UTF-8, при этом каждый октет кодируется в формате %XX, с добавлением 0 слева, если это необходимо. Поскольку одиночные суррогаты в UTF-16 не кодируют действительных символов Unicode, они вызывают выбрасывание URIError функцией encodeURI().
encodeURI() экранирует все символы, кроме:
A–Z a–z 0–9 - _ . ! ~ * ' ( ) ; / ? : @ & = + $ , #
Символы на второй строке — это символы, которые могут быть частью синтаксиса URI и экранируются только функцией encodeURIComponent(). Обе функции, encodeURI() и encodeURIComponent(), не кодируют символы -.!~*'(), известные как «незарезервированные метки», которые не имеют зарезервированного назначения, но разрешены в URI «как есть». (См. RFC2396)
Функция encodeURI() не кодирует символы, имеющие особое значение (зарезервированные символы) для URI. Следующий пример показывает все части, которые может содержать URI. Обратите внимание, как определенные символы используются для обозначения особого значения:
http://username:password@www.example.com:80/path/to/file.php?foo=316&bar=this+has+spaces#anchor
encodeURI, как следует из названия, используется для кодирования URL целиком, предполагая, что он уже корректно сформирован. Если вы хотите динамически собирать строковые значения в URL, вам, вероятно, следует использовать encodeURIComponent() для каждого динамического сегмента, чтобы избежать символов синтаксиса URL в нежелательных местах.
const name = "Ben & Jerry's";
// This is bad:
const badLink = encodeURI(`https://example.com/?choice=${name}`); // "https://example.com/?choice=Ben%20&%20Jerry's"
console.log([...new URL(badLink).searchParams]); // [['choice', 'Ben '], [" Jerry's", '']]
// Instead:
const goodLink = `https://example.com/?choice=${encodeURIComponent(name)}`;
// "https://example.com/?choice=Ben%20%26%20Jerry's"
console.log([...new URL(goodLink).searchParams]); // [['choice', "Ben & Jerry's"]]
Примеры
encodeURI() против encodeURIComponent()
encodeURI() отличается от encodeURIComponent() следующим образом:
const set1 = ";/?:@&=+$,#"; // Reserved Characters const set2 = "-.!~*'()"; // Unreserved Marks const set3 = "ABC abc 123"; // Alphanumeric Characters + Space console.log(encodeURI(set1)); // ;/?:@&=+$,# console.log(encodeURI(set2)); // -.!~*'() console.log(encodeURI(set3)); // ABC%20abc%20123 (the space gets encoded as %20) console.log(encodeURIComponent(set1)); // %3B%2C%2F%3F%3A%40%26%3D%2B%24%23 console.log(encodeURIComponent(set2)); // -.!~*'() console.log(encodeURIComponent(set3)); // ABC%20abc%20123 (the space gets encoded as %20)
Кодирование одиночного суррогата вызывает ошибку
Будет выброшено исключение URIError, если попытаться закодировать суррогат, который не является частью суррогатной пары. Например:
// High-low pair OK
encodeURI("\uD800\uDFFF"); // "%F0%90%8F%BF"
// Lone high-surrogate code unit throws "URIError: malformed URI sequence"
encodeURI("\uD800");
// Lone low-surrogate code unit throws "URIError: malformed URI sequence"
encodeURI("\uDFFF");
Вы можете использовать String.prototype.toWellFormed(), которая заменяет одиночные суррогаты символом замены Unicode (U+FFFD), чтобы избежать этой ошибки. Вы также можете использовать String.prototype.isWellFormed() для проверки, содержит ли строка одиночные суррогаты, прежде чем передавать ее в encodeURI().
Кодирование для RFC3986
Более поздний RFC3986 делает квадратные скобки зарезервированными (для IPv6) и, следовательно, не кодируются при формировании того, что может быть частью URL (например, имени хоста). Он также резервирует символы !, ', (, ), и *, хотя эти символы не имеют формализованного использования в качестве разделителей URI. Следующая функция кодирует строку для формата URL, совместимого с RFC3986.
function encodeRFC3986URI(str) {
return encodeURI(str)
.replace(/%5B/g, "[")
.replace(/%5D/g, "]")
.replace(
/[!'()*]/g,
(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,
);
}
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
encodeURI |
1 |
12 |
1 |
7 |
1.1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.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/encodeURI