В чем разница между функциями JavaScript decodeURIComponent
и decodeURI
?
В чем разница между 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 не будет.