web-dev-qa-db-fra.com

L'encodage URL voit "" (esperluette) comme "amp;" entité HTML

Je code une chaîne qui sera transmise dans une URL (via GET). Mais si j'utilise escape, encodeURI ou encodeURIComponent, & sera remplacé par %26amp%3B, mais je veux qu'il soit remplacé par %26 . Qu'est-ce que je fais mal?

291
dododedodonl

Sans voir votre code, il est difficile de répondre à autre chose qu'un coup de poignard dans le noir. Je suppose que la chaîne à laquelle vous passez encodeURIComponent (), qui est la méthode correcte à utiliser, provient du résultat de l'accès à la propriété innerHTML. La solution consiste à obtenir la valeur de la propriété innerText/textContent:

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

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

Si ce n'est pas le cas, vous pouvez utiliser la méthode replace () pour remplacer l'entité HTML:

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

Si vous avez littéralement ceci:

encodeURIComponent('&')

Alors le résultat est %26, vous pouvez le tester ici . Assurez-vous que la chaîne que vous encodez est juste & et non & pour commencer ... sinon, l'encodage est correct , ce qui est probablement le cas. Si vous avez besoin d'un résultat différent pour une raison quelconque, vous pouvez effectuer un .replace(/&/g,'&') avant l'encodage.

93
Nick Craver

Il existe des codages HTML et URI. & est &codé en HTML tandis que %26 est & dans codage URI .

Donc, avant de coder votre chaîne, vous voudrez peut-être décoder en HTML, puis la coder en URI :)

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

résultat %26AndOtherHTMLEncodedStuff

J'espère que cela vous fait gagner du temps

2