Кодирование URL видит «&» (амперсанд) как «& amp;» HTML-сущность

293

Я кодирую строку, которая будет передана в URL (через GET). Но если я использую escape, encodeURIили encodeURIComponent, &будет заменен на %26amp%3B, но я хочу, чтобы он был заменен на %26. Что я делаю не так?

dododedodonl
источник
Откуда взята строка? Можете ли вы опубликовать код, который у вас есть?
Энди Э
1
&это правильный способ избежать амперсанда в контексте HTML ... откуда ваш источник? а какой пункт назначения? Может быть, лучше сделать это на стороне сервера, например.
Ник Крейвер
Я извлекаю что-то из тела HTML (и это закодировано в HTML (то есть, я теперь понимаю), и мне нужно передать это в URL ... Итак, мне нужно декодировать HTML (но как?) Затем кодируем строку (с encodeURIComponent) ...
dododedodonl
2
нашел это ... Я использовал в jquery .html (), а не .text () ... глупо (A)
dododedodonl
1
jQuery .html () сопоставляется со свойством innerHTML , поэтому проблема заключается в том, как я уже сказал в своем ответе :-)
Энди E

Ответы:

438

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

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

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

Если это не так, вы можете использовать метод replace () для замены сущности HTML:

encodeURIComponent(str.replace(/&/g, "&"));
Энди Э
источник
94

Если вы сделали буквально это:

encodeURIComponent('&')

Тогда результат %26, вы можете проверить это здесь . Убедитесь, что строка, которую вы кодируете, просто & и не &для начала ... в противном случае она кодируется правильно, что, скорее всего, и так. Если вам нужен другой результат по какой-то причине, вы можете сделать .replace(/&/g,'&')перед кодировкой.

Ник Крейвер
источник
3
... это, наверное, его проблема.
Пекка
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

Надеюсь, это сэкономит вам время

Матас Вайткявичюс
источник