Яка різниця між функціями 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 (використовуючи% -cacaped UTF-8 для кодування non-ASCII ).
decodeURI декодує ті самі символи, що і decodeURIComponent, за винятком кількох спеціальних. Він надається як обернений kododeURI, але ви все ще не можете розраховувати на те, що він поверне той самий, що і ви спочатку ввели - див. decodeURI(encodeURI('%20 '));.
Там, де encodeURI дійсно має бути названий fixBrokenURI (), декодеURI () можна однаково назвати потенційно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") повертає "A".encodeURI("A") повертає "A", він не кодує "A" до "% 41"decodeURI("%41") повертає "A".-То означає, що обидва можуть декодувати буквено-цифрові символи, навіть якщо вони не кодували їх. Однак ...
encodeURIComponent("&") повертає "% 26".decodeURIComponent("%26") повертає "&".encodeURI("&") повертає "&".decodeURI("%26") повертає "% 26".Навіть незважаючи на те, що encodeURIComponent не кодує всіх символів, декодуванняURIComponent може декодувати будь-яке значення між% 00 та% 7F.
Примітка. Здається, що якщо ви спробуєте розшифрувати значення вище% 7F (якщо це не значення унікоду), ваш сценарій не вдасться з "помилкою URI".
encodeURIComponent()Перетворює вхід у кодований URL-адресою рядок
encodeURI()URL-код кодує вхід, але передбачає, що вказана повна URL-адреса, тому повертає дійсну URL-адресу, не кодуючи протокол (наприклад, http: // ) та ім'я хоста (наприклад, www.stackoverflow.com ).
decodeURIComponent()і decodeURI()є протилежними до сказаного
encodeURICкомпонент не уникнути:
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") == "é";