Pengkodean URL melihat "&" (ampersand) sebagai "& amp;" Entitas HTML

293

Saya menyandikan string yang akan dikirimkan dalam URL (via GET). Tetapi jika saya menggunakan escape, encodeURIatau encodeURIComponent, &akan diganti dengan %26amp%3B, tetapi saya ingin itu diganti dengan %26. Apa yang saya lakukan salah?

dododedodonl
sumber
Dari mana asalnya? Bisakah Anda memposting kode yang Anda miliki sejauh ini?
Andy E
1
&adalah cara yang tepat untuk menghindari ampersand dalam konteks HTML ... dari mana sumber Anda berasal? dan apa tujuannya? Mungkin lebih baik untuk melakukan sisi server ini misalnya.
Nick Craver
Saya mengambil sesuatu dari badan HTML (dan itu adalah HTML yang disandikan (jadi, ada & amp; saya sadari sekarang)) dan saya harus memasukkannya dalam URL ... Jadi, saya perlu men-decode html (tapi bagaimana?) dan kemudian menyandikan string (dengan komponen encodeURIC) ...
dododedodonl
2
menemukannya ... Saya menggunakan jquery .html (), bukan .text () ... stupid (A)
dododedodonl
1
jQuery's .html () memetakan ke properti innerHTML , jadi masalahnya adalah seperti yang saya katakan dalam jawaban saya :-)
Andy E

Jawaban:

438

Tanpa melihat kode Anda, sulit untuk menjawab selain tikaman dalam gelap. Saya kira string yang Anda lewati ke encodeURIComponent () , yang merupakan metode yang tepat untuk digunakan, berasal dari hasil mengakses properti innerHTML . Solusinya adalah mendapatkan nilai properti innerText / textContent sebagai gantinya:

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

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

Jika bukan itu masalahnya, Anda dapat menggunakan metode replace () untuk mengganti entitas HTML:

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

Jika Anda benar-benar melakukan ini:

encodeURIComponent('&')

Maka hasilnya adalah %26, Anda bisa mengujinya di sini . Pastikan string yang Anda encode itu adil & dan tidak &dimulai dengan ... jika tidak, encoding dengan benar, yang mungkin terjadi. Jika Anda memerlukan hasil yang berbeda untuk beberapa alasan, Anda dapat melakukan .replace(/&/g,'&')sebelum penyandian.

Nick Craver
sumber
3
... itu mungkin masalahnya.
Pekka
2

Ada penyandian HTML dan URI. &adalah & dikodekan dalam HTML sementara %26adalah &di URI encoding .

Jadi sebelum URI menyandikan string Anda, Anda mungkin ingin mendekode HTML dan kemudian URI menyandikannya :)

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

hasil %26AndOtherHTMLEncodedStuff

Semoga ini menghemat waktu Anda

Matas Vaitkevicius
sumber