В чем разница между decodeURIComponent и decodeURI?

В чем разница между функциями JavaScript decodeURIComponent и decodeURI?

Ответ 1

Чтобы объяснить разницу между этими двумя, позвольте мне объяснить разницу между encodeURI и encodeURIComponent.

Основное отличие состоит в том, что:

  • encodeURI предназначен для использования в полном URI.
  • encodeURIComponent предназначен для использования на.. ну.. URI-компонентах, которые любая часть, которая лежит между разделителями (;/?: @и = + $, #).

Итак, в encodeURIComponent эти разделители кодируются также потому, что они рассматриваются как текстовые, а не специальные символы.

Теперь вернемся к разнице между функциями декодирования, каждая функция декодирует строки, сгенерированные его соответствующим кодировщиком, заботясь о семантике специальных символов и их обработке.

Ответ 2

encodeURIComponent/decodeURIComponent() - это почти всегда пара, которую вы хотите использовать, для объединения и разделения текстовых строк в частях URI.

encodeURI менее распространен и ошибочно назван: его действительно следует называть fixBrokenURI. Это требует почти URI, но имеет недопустимые символы, такие как пробелы в нем, и превращает его в настоящий URI. Он имеет правильное применение для исправления недопустимых URI с пользовательского ввода и может также использоваться для превращения IRI (URI с голыми символами Unicode) в простой URI (с использованием% -escaped UTF-8 для кодирования не-ASCII).

decodeURI декодирует те же символы, что и decodeURIComponent, за исключением нескольких специальных. Он предоставляется как инверсный для encodeURI, но вы все равно не можете рассчитывать на то, что он вернется так же, как вы первоначально ввели - см., Например. decodeURI(encodeURI('%20 '));.

В тех случаях, когда encodeURI действительно нужно называть fixBrokenURI(), decodeURI() можно в равной степени называть потенциальнымBreakMyPreviouslyWorkingURI(). Я могу думать о том, что он нигде не может быть полезен; избежать.

Ответ 3

js> s = "http://www.example.com/string with + and ? and & and spaces";
http://www.example.com/string with + and ? and & and spaces
js> encodeURI(s)
http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces
js> encodeURIComponent(s)
http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces

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

Ответ 4

encodeURIComponent()

Преобразует вход в URL-кодированный строка

encodeURI()

URL-кодирует ввод, но предполагает полный URL-адрес, поэтому возвращает допустимый URL, не кодируя протокол (например, http://) и имя хоста (например, www.stackoverflow.com).

decodeURIComponent() и decodeURI() являются противоположными указанным выше

Ответ 5

Поскольку у меня был тот же вопрос, но я не нашел здесь ответа, я провел несколько тестов, чтобы выяснить, в чем разница. Я сделал это, так как мне нужна кодировка для чего-то, что не связано с URL/URI.

  • encodeURIComponent("A") возвращает "A" , он не кодирует "A" в "% 41"
  • decodeURIComponent("%41") возвращает "A" .
  • encodeURI("A") возвращает "A" , он не кодирует "A" в "% 41"
  • decodeURI("%41") возвращает "A" .

-That означает, что оба могут декодировать буквенно-цифровые символы, даже если они не кодируют их. Однако...

  • encodeURIComponent("&") возвращает "% 26".
  • decodeURIComponent("%26") возвращает "&".
  • encodeURI("&") возвращает "&".
  • decodeURI("%26") возвращает "% 26".

Даже если encodeURIComponent не кодирует все символы, decodeURIComponent может декодировать любое значение между% 00 и% 7F.

Примечание. Похоже, что если вы попытаетесь декодировать значение выше% 7F (если это не значение в unicode), то ваш script завершится с ошибкой URI.

Ответ 6

decodeURIComponent будет декодировать специальные маркеры URI, такие как &,?, # и т.д., decodeURI не будет.