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

363

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

Джон Такабери
источник

Ответы:

398

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

Основное отличие заключается в том, что:

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

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

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

MahdeTo
источник
4
Еще одно существенное отличие заключается в том, что unescape не обрабатывает многобайтовые последовательности UTF-8, тогда как decodeURI [Component] выполняет:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris
ИМХО, привести несколько примеров было бы очень полезно
трансанг
114

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 (). Я не могу думать ни о каком действительном использовании этого где-либо; избежать.

bobince
источник
11
decodeURI (encodeURI ('% 20')) правильно выдает "% 20" в ie, chrome и firefox, просто интересно, из какого браузера / версии вы получили неправильный результат?
ccppjava
1
Возможно, он был сломан в 2009 году, но тем временем современный браузер догнал (я думаю).
ВудроШигеру
68
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дополнительно кодирует двоеточие, косую черту и символы плюс и предназначен для использования в строках запроса. Кодировка + и? и & имеет здесь особое значение, так как это специальные символы в строках запроса.

Джейсон С
источник
30

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

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

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

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

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

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

Кул-ТИГИН
источник
Примечание: в первом decodeURIComponent есть опечатка (m вместо n). Я не могу исправить это, потому что мне нужно отредактировать как минимум 6 символов.
SuperNova
23

encodeURIComponent()

Преобразует ввод в строку в кодировке URL

encodeURI()

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

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

Русь Кэм
источник
12

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

Bjorn
источник