URL编码将“&”(&字符)视为“&”HTML实体

我正在编码一个字符串,将在URL中传递(通过GET)。但如果我使用escapeencodeURIencodeURIComponent&将被替换为%26amp%3B,但我希望它被替换为%26。我做错了什么?

419068 次浏览

如果你真的这么做了:

encodeURIComponent('&')

那么结果是%26你可以在这里测试。确保你正在编码的字符串是只是 &,而不是&开始…否则,编码是正确的,这是可能的情况。如果由于某些原因需要不同的结果,可以在编码之前执行.replace(/&/g,'&')

在没有看到代码的情况下,除了在黑暗中摸索之外,很难回答问题。我猜你传递给encodeURIComponent()的字符串,这是使用的正确方法,来自访问innerHTML属性的结果。解决方案是获得innerText/textContent属性值:

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


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

如果不是这样,你可以使用替换()方法来替换HTML实体:

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

有HTML和URI编码。&& HTML编码,而%26URI编码中的&

所以在URI编码字符串之前,你可能想要HTML解码,然后URI编码它:)

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

结果%26AndOtherHTMLEncodedStuff

希望这能为您节省一些时间

澄清一下,< >强从未< / >强应该使用encodeURI()encodeURIComponent()。如果你不同意,看看结果…

console.log(encodeURIComponent('@#$%^&*'));

Input: ^&*.

Output: %40%23%24%25%5E%26*.

That's not right, is it? * did not get converted! I hope you're not using this as a server-side cleansing function, because * will not be treated as input but as commands, i.e., imagine deleting a user's alleged file with rm *. Well, I hope you're not using encodeURI() or encodeURIComponent()!

TLDR: You actually want fixedEncodeURIComponent() and fixedEncodeURI().

MDN encodeURI() Documentation...

function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}

MDN encodeURIComponent() Documentation .……

function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}

对于这些函数,使用fixedEncodeURI()来编码单个URL片段,而fixedEncodeURIComponent()将编码URL片段和连接器;或者,更简单地说,fixedEncodeURI()不会编码+@?=:#;,$&(因为&+是常见的URL操作符),但fixedEncodeURIComponent()会。