Вы не должны использовать 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).