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?


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, "&"));

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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.