Чим відрізняється декодуванняURIComponent від decodeURI?


Відповіді:


398

Щоб пояснити різницю між цими двома, дозвольте мені пояснити різницю між encodeURIта encodeURIComponent.

Основна відмінність полягає в тому, що:

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

Так, у encodeURIComponentцих роздільниках закодовано ще й тому, що вони розглядаються як текст, а не спеціальні символи.

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


4
Ще одна важлива відмінність полягає в тому, що unescape не обробляє багатобайтові послідовності UTF-8, тоді як декодері [Компонент] робить:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris

ІМХО,
наведення

114

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 (). Я ніде не можу подумати, що для цього є корисним; уникати.


11
decodeURI (encodeURI ('% 20')) дає "% 20" правильно, тобто chrome та firefox, просто цікаво, у якого браузера / версії невірний результат, який ви спостерігали?
ccppjava

1
Можливо, це було зламано в 2009 році, але сучасний браузер тим часом наздогнав (я думаю).
WoodrowShigeru

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") повертає "A".
  • encodeURI("A") повертає "A", він не кодує "A" до "% 41"
  • decodeURI("%41") повертає "A".

-То означає, що обидва можуть декодувати буквено-цифрові символи, навіть якщо вони не кодували їх. Однак ...

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

Навіть незважаючи на те, що encodeURIComponent не кодує всіх символів, декодуванняURIComponent може декодувати будь-яке значення між% 00 та% 7F.

Примітка. Здається, що якщо ви спробуєте розшифрувати значення вище% 7F (якщо це не значення унікоду), ваш сценарій не вдасться з "помилкою URI".


Примітка. Існує помилка в першому декодуванніURICкомпонента (m замість n). Я не можу це виправити, оскільки мені потрібно відредагувати щонайменше 6 символів.
SuperNova

23

encodeURIComponent()

Перетворює вхід у кодований URL-адресою рядок

encodeURI()

URL-код кодує вхід, але передбачає, що вказана повна URL-адреса, тому повертає дійсну URL-адресу, не кодуючи протокол (наприклад, http: // ) та ім'я хоста (наприклад, www.stackoverflow.com ).

decodeURIComponent()і decodeURI()є протилежними до сказаного


12

decodeURIComponent розшифрує спеціальні маркери URI, такі як &,?, # тощо, decodeURI не буде.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.