Ви не повинні використовувати encodeURIComponent()
або encodeURI()
. Ви повинні використовувати fixedEncodeURIComponent()
і fixedEncodeURI()
, згідно з документацією MDN.
Щодо encodeURI()
...
Якщо ви хочете слідкувати за останніми RFC3986 для URL-адрес, що робить квадратні дужки зарезервованими (для IPv6) і, таким чином, не кодується, формуючи щось, що може бути частиною URL-адреси (наприклад, хост), може допомогти наступний фрагмент коду:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
Щодо encodeURIComponent()
...
Щоб бути більш суворим у дотриманні RFC 3986 (який резервує!, ', (,) І *), хоча ці символи не мають формалізованого використання URI, що обмежує використання, можна безпечно використовувати наступне:
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
Отже, у чому різниця? fixedEncodeURI()
і fixedEncodeURIComponent()
перетворити той же набір значень, але fixedEncodeURIComponent()
і перетворює цей набір: +@?=:*#;,$&
. Цей набір використовується в GET
параметрах ( &
, +
тощо), тегах прив’язки ( #
), тегах підстановки ( *
), частинах електронної пошти / імені користувача ( @
) та ін.
Наприклад - якщо ви користуєтесь encodeURI()
, user@example.com/?email=me@home
не буде належним чином надсилати другий @
на сервер, за винятком того, що ваш браузер обробляє сумісність (як це звичайно робить Chrome).