Кодирование URL видит «&» (амперсанд) как «&» сущность HTML - PullRequest
290 голосов
/ 22 августа 2010

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

Ответы [ 3 ]

431 голосов
/ 22 августа 2010

Не видя ваш код, трудно ответить, кроме удара в темноте.Я предполагаю, что строка, которую вы передаете 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, "&"));
93 голосов
/ 22 августа 2010

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

encodeURIComponent('&')

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

2 голосов
/ 12 мая 2015

Есть кодировки 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);

result %26AndOtherHTMLEncodedStuff

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

...