Должен ли я использовать encodeURI или encodeURIComponent для кодирования URL?

Какой из этих двух методов следует использовать для кодирования URL-адресов?

Ответ 1

Это зависит от того, что вы действительно хотите сделать.

encodeURI предполагает, что вход представляет собой полный URI, который может содержать некоторые символы, которым требуется кодировка.

encodeURIComponent будет кодировать все со специальным значением, поэтому вы используете его для компонентов URI, таких как

var world = "A string with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);

Ответ 2

Если вы кодируете строку для размещения URL-компонента (параметр querystring), вы должны вызвать encodeURIComponent.

Если вы кодируете существующий URL-адрес, вызовите encodeURI.

Ответ 3

http://xkr.us/articles/javascript/encode-compare/ имеет большое обсуждение с примерами. Чтобы процитировать их резюме:

"Метод escape() не кодирует символ +, который интерпретируется как пространство на стороне сервера, а также генерируется формами с пробелами в их полях. Из-за этого недостатка и того факта, что эта функция не справляется не-ASCII-символы, вы должны избегать использования escape(), когда это возможно. Лучшей альтернативой обычно является encodeURIComponent().

escape() не будет кодировать: @*/+

Использование метода encodeURI() является немного более специализированным, чем escape(), поскольку оно кодирует URI [REF] в отличие от последовательности запросов, которая является частью URL-адреса. Используйте этот метод, когда вам нужно закодировать строку, которая будет использоваться для любого ресурса, который использует URI, и требует, чтобы определенные символы оставались незашифрованными. Обратите внимание, что этот метод не кодирует символ, поскольку он является допустимым символом в URI.

encodeURI() не будет кодировать: ~! @# $& *() =:/,;? + '

Наконец, метод encodeURIComponent() должен использоваться в большинстве случаев при кодировании одного компонента URI. Этот метод будет кодировать некоторые символы, которые обычно распознаются как специальные символы для URI, так что многие компоненты могут быть включены. Обратите внимание, что этот метод не кодирует символ, поскольку он является допустимым символом в URI.

encodeURIComponent() не будет кодировать: ~! *() '"

Ответ 4

encodeURIComponent(): предполагает, что его аргумент является частью (такой как протокол, имя хоста, путь или строка запроса) URI. Поэтому он избегает символов пунктуации, которые используются для разделения частей URI.

encodeURI(): используется для кодирования существующего url

Ответ 5

Если вы хотите также закодировать эти символы: ! ' * ) (, тогда Решение:

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

(источник)

Ответ 6

Как правило, используйте encodeURIComponent. Не бойтесь длинного имени, думая, что это более конкретное в нем использование, для меня это более часто используемый метод. Также не следует использовать encodeURI, потому что вы протестировали его и, похоже, правильно кодировали, возможно, это не то, что вы хотели использовать, и даже если ваш простой тест с использованием "Fred" в поле имени сработал, вы найдете позже, когда вы используете более продвинутый текст, например, добавление амперсанда или хешетага, он не сработает. Вы можете посмотреть на другие ответы по причинам, почему это так.