A codificação de URL vê "&" (e comercial) como "& amp;" Entidade HTML

293

Estou codificando uma string que será passada em uma URL (via GET). Mas se eu usar escape, encodeURIou encodeURIComponent, &será substituído por %26amp%3B, mas quero que seja substituído por %26. O que estou fazendo de errado?

dododedodonl
fonte
De onde vem a corda? Você pode postar o código que você tem até agora?
Andy E
1
&é a maneira correta de escapar do e comercial em um contexto HTML ... de onde vem sua fonte? e qual é o destino? Pode ser melhor fazer isso do lado do servidor, por exemplo.
Nick Craver
Eu pego algo do corpo do HTML (e isso é codificado em HTML (então, existe & amp; eu percebo agora)) e eu tenho que passá-lo em uma URL ... Então, eu preciso decodificar o html (mas como?) en seguida, codificar a string (com encodeURIComponent) ...
dododedodonl
2
achei ... eu usei no jquery .html (), não .text () ... estúpido (A)
dododedodonl
1
jQuery .html () mapeia para o innerHTML propriedade, então a questão é como eu disse na minha resposta :-)
Andy E

Respostas:

438

Sem ver seu código, é difícil responder além de uma facada no escuro. Eu acho que a string que você está passando para encodeURIComponent () , que é o método correto a ser usado, é proveniente do resultado do acesso à propriedade innerHTML . A solução é obter o innerText / textContent valor da propriedade em vez disso:

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

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

Se não for esse o caso, você pode usar o método replace () para substituir a entidade HTML:

encodeURIComponent(str.replace(/&/g, "&"));
Andy E
fonte
94

Se você fez literalmente isso:

encodeURIComponent('&')

Em seguida, o resultado é %26, você pode testá-lo aqui . Verifique se a string que você está codificando é justa & e não &para começar ... caso contrário, ela está codificando corretamente, o que provavelmente é o caso. Se você precisar de um resultado diferente por algum motivo, poderá fazer um .replace(/&/g,'&')antes da codificação.

Nick Craver
fonte
3
... esse é provavelmente o problema dele.
Pekka
2

Existem codificações HTML e URI. &é & codificado em HTML enquanto %26está &na codificação de URI .

Portanto, antes do URI codificar sua sequência, você pode decodificar o HTML e depois codificá-lo :)

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

resultado %26AndOtherHTMLEncodedStuff

Espero que isso economize algum tempo

Matas Vaitkevicius
fonte