La codificación de URL ve "&" (ampersand) como "& amp;" Entidad HTML

293

Estoy codificando una cadena que se pasará en una URL (a través de GET). Pero si uso escape, encodeURIo encodeURIComponent, &será reemplazado por %26amp%3B, pero quiero que sea reemplazado por %26. ¿Qué estoy haciendo mal?

dododedodonl
fuente
¿De dónde viene la cuerda? ¿Puedes publicar el código que tienes hasta ahora?
Andy E
1
&es la forma correcta de escapar del ampersand en un contexto HTML ... ¿de dónde viene tu fuente? y cual es el destino? Puede ser mejor hacer este lado del servidor, por ejemplo.
Nick Craver
Tomo algo del cuerpo HTML (y eso está codificado en HTML (entonces, hay & amp; me doy cuenta ahora)) y tengo que pasarlo en una URL ... Entonces, necesito decodificar el html (¿pero cómo?) es luego codificar la cadena (con encodeURIComponent) ...
dododedodonl
2
lo encontré ... lo usé en jquery .html (), no .text () ... estúpido (A)
dododedodonl
1
El .html () de jQuery se asigna a la propiedad innerHTML , por lo que el problema es como dije en mi respuesta :-)
Andy E

Respuestas:

438

Sin ver su código, es difícil responder que no sea una puñalada en la oscuridad. Supongo que la cadena que está pasando a encodeURIComponent () , que es el método correcto para usar, proviene del resultado de acceder a la propiedad innerHTML . La solución es obtener el valor de la propiedad innerText / textContent en su lugar:

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

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

Si ese no es el caso, puede usar el método replace () para reemplazar la entidad HTML:

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

Si hiciste literalmente esto:

encodeURIComponent('&')

A continuación, el resultado es %26, puede probar aquí . Asegúrese de que la cadena que está codificando sea justa & y no &comience ... de lo contrario, está codificando correctamente, lo que probablemente sea el caso. Si necesita un resultado diferente por alguna razón, puede hacer un .replace(/&/g,'&')antes de la codificación.

Nick Craver
fuente
3
... ese es probablemente su problema.
Pekka
2

Hay codificaciones HTML y URI. &está & codificado en HTML mientras %26está &en codificación URI .

Entonces, antes de que URI codifique su cadena, es posible que desee decodificar HTML y luego codificarla con URI :)

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

resultado %26AndOtherHTMLEncodedStuff

Espero que esto te ahorre algo de tiempo

Matas Vaitkevicius
fuente