Kodowanie URL widzi „&” (ampersand) jako „& amp;” Encja HTML

293

Koduję ciąg znaków, który zostanie przekazany w adresie URL (przez GET). Ale jeśli użyję escape, encodeURIlub encodeURIComponent, &zostanie zastąpione %26amp%3B, ale chcę, aby zostało zastąpione %26. Co ja robię źle?

dododedodonl
źródło
Skąd pochodzi ta struna? Czy możesz opublikować kod, który masz do tej pory?
Andy E
1
&jest właściwym sposobem na ucieczkę ze znaku handlowego i w kontekście HTML ... skąd pochodzi twoje źródło? a jaki jest cel podróży Może być lepiej zrobić to na przykład po stronie serwera.
Nick Craver
Wykreślam coś z treści HTML (i to jest zakodowane w HTML (więc jest & amp; Rozumiem teraz)) i muszę przekazać to w adresie URL ... Więc muszę zdekodować HTML (ale jak?) en następnie
zakoduj
2
znalazłem ... Użyłem w jquery .html (), nie .text () ... głupi (A)
dododedodonl
1
JQuery's .html () odwzorowuje na właściwość innerHTML , więc problem jest taki, jak powiedziałem w mojej odpowiedzi :-)
Andy E

Odpowiedzi:

438

Bez obejrzenia kodu trudno jest odpowiedzieć inaczej niż dźgnięcie w ciemność. Sądzę, że ciąg przekazywany do metody encodeURIComponent () , która jest poprawną metodą do użycia, pochodzi z dostępu do właściwości innerHTML . Rozwiązaniem jest zamiast tego uzyskać wartość właściwości innerText / textContent :

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

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

Jeśli tak nie jest, możesz użyć metody replace () , aby zastąpić encję HTML:

encodeURIComponent(str.replace(/&/g, "&"));
Andy E.
źródło
94

Jeśli zrobiłeś to dosłownie:

encodeURIComponent('&')

Następnie wynik jest %26, można go przetestować tutaj . Upewnij się, że łańcuch, który kodujesz, jest po prostu & i nie &zaczynaj od ... w przeciwnym razie koduje się poprawnie, co jest prawdopodobne. Jeśli z jakiegoś powodu potrzebujesz innego wyniku, możesz zrobić to .replace(/&/g,'&')przed kodowaniem.

Nick Craver
źródło
3
... to prawdopodobnie jego problem.
Pekka
2

Istnieje kodowanie HTML i URI. &jest & zakodowany w HTML, podczas gdy %26jest &w kodowaniu URI .

Tak więc przed kodowaniem URI swojego ciągu możesz dekodować HTML, a następnie kodować URI :)

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

wynik %26AndOtherHTMLEncodedStuff

Mam nadzieję, że to pozwoli Ci zaoszczędzić trochę czasu

Matas Vaitkevicius
źródło