Чтобы объяснить разницу между этими двумя, позвольте мне объяснить разницу между encodeURI
и encodeURIComponent
.
Основное отличие заключается в том, что:
encodeURI
Функция предназначена для использования на полный URI.
encodeURIComponent
Функция предназначена для использования на .. хорошо .. компонентах URI , что любая часть , которая находится между разделителями (; /: @ & = + $, #?).
Таким образом, encodeURIComponent
эти разделители кодируются также потому, что они рассматриваются как текстовые, а не специальные символы.
Теперь вернемся к разнице между функциями декодирования, каждая функция декодирует строки, сгенерированные ее соответствующим аналогом кодирования, заботясь о семантике специальных символов и их обработке.
decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
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 (). Я не могу думать ни о каком действительном использовании этого где-либо; избежать.
источник
Похоже,
encodeURI
создает «безопасный» URI путем кодирования пробелов и некоторых других (например, непечатаемых) символов, в то время какencodeURIComponent
дополнительно кодирует двоеточие, косую черту и символы плюс и предназначен для использования в строках запроса. Кодировка + и? и & имеет здесь особое значение, так как это специальные символы в строках запроса.источник
Поскольку у меня был тот же вопрос, но я не нашел здесь ответа, я провел несколько тестов, чтобы выяснить, в чем на самом деле разница. Я сделал это, так как мне нужно что-то для кодировки, которая не связана с 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()
иdecodeURI()
противоположность вышесказанномуисточник
decodeURIComponent будет декодировать специальные маркеры URI, такие как &,?, # и т. д., decodeURI - нет.
источник
Код не использован
encodeURI () Не удалось избежать:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
источник