编码window.location.hash

window.location.hash是否包含url部分的编码或解码表示?

当我在Firefox 3.5和Internet Explorer 8中打开相同的URL( http://localhost/something/#%C3%BC ,其中%C3%BC转换为ü )时, document.location.hash会得到不同的值:

  • IE8: #%C3%BC
  • FF3.5:

有没有办法在两个浏览器中获得一个变体?

不幸的是,这是Firefox中的一个错误,因为它会在访问location.hash时解码额外的时间。 例如,在Firefox中试试这个:

 location.hash = "#%30"; location.hash === "#0"; // This is wrong, it should be "#%30" 

唯一的跨浏览器的解决scheme是使用(location.href.split("#")[1] || "")来获得散列。 使用location.hash设置哈希似乎对所有支持location.hash浏览器都能正常工作。

回答我自己的问题,我目前的解决scheme是parsingwindow.location.href而不是使用window.location.hash ,因为前者总是(即在每个浏览器中)url编码。 因此,所提出的decodeURIComponent函数CMS总是可以安全地使用。 YUI也是这样,所以不可能是那个错

你可以使用decodeURIComponent ,它会在所有情况下返回

 decodeURIComponent('#%C3%BC'); // #ü decodeURIComponent('#ü'); // #ü 

试试看。

实际上,在我的Firefox版本(Linux版本为3.5)中,如果在URL中input“#%C3%BC”作为哈希值,则URL本身实际上会以“#ü” 转换为unicode。 但是你似乎已经回答了你自己的问题 – 在Firefox中,浏览器在URL中转换实体转义码,而在IE中则不转换。

我的build议实际上是这样的:在URL中根本没有放置“#%C3%BC”,只需在散列和URL中使用完整的Unicode。 这是一个select吗? 它应该在任何现代浏览器工作正常。