window.location.hash的编码

时间:2009-11-09 20:27:16

标签: javascript html url encoding fragment-identifier

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

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

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

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

4 个答案:

答案 0 :(得分:38)

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

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

唯一的跨浏览器解决方案是仅使用(location.href.split("#")[1] || "")来获取哈希值。使用location.hash设置哈希似乎适用于支持location.hash的所有浏览器。

答案 1 :(得分:5)

回答我自己的问题,我目前的解决方案是解析window.location.href而不是使用window.location.hash,因为前者始终(即在每个浏览器中)都是url编码的。因此,始终可以安全地使用提议的decodeURIComponent函数 CMS YUI 做同样的事情,因此它不会那么错......

答案 2 :(得分:4)

您可以使用decodeURIComponent,在所有情况下都会返回

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

尝试here

答案 3 :(得分:0)

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

我的建议实际上是这样的:不要在URL中添加“#%C3%BC”,只需在哈希和URL中使用完整的unicode即可。这是一个选择吗?它应该可以在任何现代浏览器中正常工作。