В чем разница между функциями JavaScript decodeURIComponentи decodeURI?
В чем разница между функциями JavaScript decodeURIComponentи decodeURI?
Ответы:
Чтобы объяснить разницу между этими двумя, позвольте мне объяснить разницу между encodeURIи encodeURIComponent.
Основное отличие заключается в том, что:
encodeURIФункция предназначена для использования на полный URI.encodeURIComponentФункция предназначена для использования на .. хорошо .. компонентах URI , что любая часть , которая находится между разделителями (; /: @ & = + $, #?).Таким образом, encodeURIComponentэти разделители кодируются также потому, что они рассматриваются как текстовые, а не специальные символы.
Теперь вернемся к разнице между функциями декодирования, каждая функция декодирует строки, сгенерированные ее соответствующим аналогом кодирования, заботясь о семантике специальных символов и их обработке.
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 (). Я не могу думать ни о каком действительном использовании этого где-либо; избежать.
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дополнительно кодирует двоеточие, косую черту и символы плюс и предназначен для использования в строках запроса. Кодировка + и? и & имеет здесь особое значение, так как это специальные символы в строках запроса.
Поскольку у меня был тот же вопрос, но я не нашел здесь ответа, я провел несколько тестов, чтобы выяснить, в чем на самом деле разница. Я сделал это, так как мне нужно что-то для кодировки, которая не связана с 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».
encodeURIComponent()Преобразует ввод в строку в кодировке URL
encodeURI()URL-кодирует входные данные, но предполагает, что задан полный URL-адрес, поэтому возвращает действительный URL-адрес, не кодируя протокол (например, http: // ) и имя хоста (например, www.stackoverflow.com ).
decodeURIComponent()и decodeURI()противоположность вышесказанному
Код не использован
A-Z a-z 0-9 - _ . ! ~ * ' ( )
encodeURI () Не удалось избежать:
A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
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
decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";