Кодування URL бачить "&" (амперсанд) як "& amp;" Сутність HTML


293

Я кодую рядок, який буде переданий за URL-адресою (через GET). Але якщо я використовую escape, encodeURIабо encodeURIComponent, &буде замінено на %26amp%3B, але я хочу, щоб його замінили %26. Що я роблю неправильно?


Звідки береться рядок? Чи можете ви розмістити код, який у вас є?
Енді Е

1
&це правильний спосіб уникнути амперсанда в контексті HTML ... звідки береться ваше джерело? і яке призначення? Можливо, краще це зробити, наприклад, на стороні сервера.
Нік Крейвер

Я схоплюю щось із HTML-тела (а це HTML закодовано (значить, є & amp; я зараз розумію)) і мені потрібно передати це за URL-адресою ... Отже, мені потрібно розшифрувати html (але як?) jw.org uk тоді кодуйте рядок (з encodeURIComponent) ...
dododedodonl

2
знайшов його ... Я використав у jquery .html (), не .text () ... дурний (A)
dododedodonl

1
JQuery в .html () відображає на innerHTML власності, тому питання, як я сказав в моїй обороні :-)
Andy E

Відповіді:


438

Не бачивши свого коду, важко відповісти, крім удару в темряві. Я б здогадався, що рядок, який ви передаєте до кодуURIComponent () , який є правильним методом використання, походить від результату доступу до властивості innerHTML . Рішення полягає в тому, щоб отримати значення властивості innerText / textContent замість:

var str, 
    el = document.getElementById("myUrl");

if ("textContent" in el)
    str = encodeURIComponent(el.textContent);
else
    str = encodeURIComponent(el.innerText);

Якщо це не так, ви можете використовувати метод substitution () для заміни сутності HTML:

encodeURIComponent(str.replace(/&/g, "&"));

94

Якщо ви зробили буквально це:

encodeURIComponent('&')

Тоді результат є %26, ви можете протестувати його тут . Переконайтеся, що рядок, який ви кодуєте, є справедливим, & а не &починати з ... інакше це кодування правильно, що, швидше за все, так і є. Якщо вам потрібен інший результат з якихось причин, ви можете зробити .replace(/&/g,'&')кодування перед кодуванням.


3
... це, мабуть, його проблема.
Pekka

2

Є кодування HTML і URI. &буде & закодований у форматі HTML , а %26це &в кодуванні URI .

Тому перед кодуванням URI рядка ви можете розшифрувати HTML, а потім URI кодувати його :)

var div = document.createElement('div');
div.innerHTML = '&AndOtherHTMLEncodedStuff';
var htmlDecoded = div.firstChild.nodeValue;
var urlEncoded = encodeURIComponent(htmlDecoded);

результат %26AndOtherHTMLEncodedStuff

Сподіваюсь, це заощадить певний час

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