Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript URL的片段部分应该如何转义?_Javascript_Url_Fragment - Fatal编程技术网

Javascript URL的片段部分应该如何转义?

Javascript URL的片段部分应该如何转义?,javascript,url,fragment,Javascript,Url,Fragment,如果URL的片段部分(即#之后)有不寻常的字符,应如何转义(百分比)?在浏览器如何处理这个问题上,我找不到一致的答案,这可能是不使用浏览器的一个很好的理由,但我想知道“正确”的答案是什么 我的测试似乎建议根本不要逃避,但这只有在遵循链接时才可靠,而不是粘贴到浏览器的地址栏时 我写了一个小网页作为附件。然后我将以下链接粘贴到各种浏览器中。页面中的“go”链接用于查看当您单击链接而不是粘贴链接时会发生什么(在某些浏览器中这似乎有所不同) {#&}%7B%23%20%26%7D (我注意到stacko

如果URL的片段部分(即#之后)有不寻常的字符,应如何转义(百分比)?在浏览器如何处理这个问题上,我找不到一致的答案,这可能是不使用浏览器的一个很好的理由,但我想知道“正确”的答案是什么

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

我写了一个小网页作为附件。然后我将以下链接粘贴到各种浏览器中。页面中的“go”链接用于查看当您单击链接而不是粘贴链接时会发生什么(在某些浏览器中这似乎有所不同)

{#&}%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



测试
函数wibble(){
document.getElementById(“摆动”).innerHTML=
location.hash.replace(//&/g,“&;”).replace(//g,”);
}
ABNF in说片段是由PCHAR组成的,也就是说,它们是百分比编码的

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

-.~!$&'()*+,;=:@


所有其他字符都应采用百分比编码。

记住,类似JavaScript的内联代码段中的实体引用将由HTML解析器展开,因此代码实际上表示
location.hash.replace(//&/g,&”).replace(//g,“>”)-您可能想使用
<代码>]]>
这只是一个测试脚本,不会影响结论。如果你没有JS,那就没有抓住要点。
<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>