如果 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,"&").replace(/</g,"<").replace(/>/g,">");
}
</script>
</head>
<body onload='wibble()'>
<div id='wobble'></div>
<a href='/test.html?new=1#{# &}%7B%23%20%26%7D'>go</a>
</body>
</html>