编码/解码“&”在URL参数中

时间:2014-02-20 07:45:11

标签: javascript

这是我使用encodeURI

在JavaScript中编码的字符串

原始字符串 - copyright =版权所有©2003

这是编码的字符串 - 版权所有%20%C2%A9%202003

我正在使用www://abc.com?param=Copyright%20%C2%A9%202003这样的链接传递此文本,而这个链接会打开一个javascript弹出窗口。

但是当我在弹出页面中解码这个字符串时,在IE10中就像“版权所有©2003”一样,在Chrome和& Firefox显示为“Copyright©2003”。

我理解IE没有正确显示这个特殊字符©,为此我们需要使用"&copy"。但不知何故,我无法发送"&copy"作为参数,因为它将"&copy"视为新参数本身,因为它以"&"开头

您能告诉我如何使用javascript在IE上正确编码/解码此文本。

2 个答案:

答案 0 :(得分:1)

使用像©这样的HTML实体仅对转义HTML中的特殊字符有效。将其作为URL的参数发送是没有用的。

您遇到的问题似乎是浏览器使用UTF-8编码来存储字符串,©字符存储为2字节序列,在URL中编码为%C2%A9 。解码URL的页面似乎不使用UTF-8并将2个字节解码为2个单独的字符©

只要您不告诉浏览器使用哪个字符集,它就可以选择它认为最好的选项。 Firefox和Chrome似乎更喜欢UTF-8并正确编码和解码字符串。 Internet Explorer 10似乎在每个页面中选择了不同的字符集。

您应该确保所有页面都有

<meta http-equiv="content-type" content="text/html; charset=UTF-8">
HTML标头中的

标记。这通常会告诉浏览器哪个charset用于字符串,并且应该解决URL中非ASCII字符的编码和解码问题。

答案 1 :(得分:0)

对您发送的参数(以及另一端的encodeURIComponent)使用decodeURIComponent以及正确的元标记(下面是更简单但仍然向后兼容且符合HTML5的方式)和文档编码。这将逃避&=之类的问题,否则会被视为参数分隔符。

这是IE10和FF27测试的演示:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
</head>
<body>

<script>

var testString = '\u00a9'; // Show the copyright symbol by default
              // though you can test with "&" and "=" in here as well
var loc = window.location.href;
if (loc.indexOf('param=') === -1) { // Add the param if not present
    window.location += '?param=' + encodeURIComponent(testString);
}

// Show the symbol after the param (in a safe manner).
document.body.appendChild(document.createTextNode(
    decodeURIComponent(loc.replace(/.*?\?param=/, ''))
));
</script>

</body>
</html>