如何对URL的片段部分进行转义?

时间:2012-12-13 13:52:05

标签: javascript url fragment

如果URL在片段部分中有异常字符(即在#之后),它们应该如何(百分比)转义?我无法在浏览器如何处理这个问题时找到一致的答案,这可能是没有它们的好理由,但我想知道“正确”的答案是什么。

我的测试似乎建议不要逃避,但这只有在关注链接时才可靠,而不是粘贴到浏览器的地址栏时。

我写了一个附加的小网页。然后我将以下链接粘贴到各种浏览器中。页面中的“go”链接可以查看单击链接时发生的情况,而不是粘贴链接(在某些浏览器中似乎有所不同)

http://www.frankieandshadow.com/test.html/?new=1# {#&}%7B%23%20%26%7D

(我注意到stackoverlow的URL模式匹配不喜欢 - 我打算整行;我可能会在那里找到线索!)

Chrome 似乎没有任何形式的错误,并且始终如一地产生:

#{#&}%7B%23%20%26%7D

Firefox 替换了一些(但不是全部)使用非转义等价物粘贴的转义字符,然后生成

#{#&} {#&}

如果您按照链接

,这是相同的

Safari (在PC上)反之亦然:它在粘贴上编码非编码的异常字符,然后生成

#%7B%23%20安培;%7D%7B%23%20%26%7D

但是链接不同,生成

#{#&}%7B%23%20%26%7D

IE9 ,令人惊讶的是,表现得像Chrome一样

IE7 在粘贴时用%20替换真实空间,否则单独留下URL,并生成

#{#%20安培;}%7B%23%20%26%7D

如果您点击该链接,则会显示

#{#&}%7B%23%20%26%7D


<html>
<head>
<title>test</title>
<script type="text/javascript">
function wibble() {
  document.getElementById("wobble").innerHTML = 
    location.hash.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
}
</script>
</head>
<body onload='wibble()'>
<div id='wobble'></div>
<a href='/test.html?new=1#{# &}%7B%23%20%26%7D'>go</a>
</body>
</html>

1 个答案:

答案 0 :(得分:6)

RFC3986中的ABNF表示片段由pchars组成 - 即它们是百分比编码。

也就是说片段标识符中的字符可以是任何字母数字或

之一

-._〜!$&amp;'()* + ,; =:@

所有其他字符应为百分比编码。