Javascript window.location.hash的编码
Javascript window.location.hash的编码,javascript,html,url,encoding,fragment-identifier,Javascript,Html,Url,Encoding,Fragment Identifier,window.location.hash是否包含url部分的编码或解码表示 当我打开相同的url(http://localhost/something/#%C3%BC其中%C3%BC在Firefox 3.5和Internet Explorer 8中转换为u),我得到了不同的document.location.hash值: IE8:#%C3%BC FF3.5:#ü 有没有办法在两种浏览器中都获得一个变体?实际上,在我的Firefox版本(Linux上为3.5)中,如果我在URL中键入“#%C3
window.location.hash是否包含url部分的编码或解码表示
当我打开相同的url(http://localhost/something/#%C3%BC
其中%C3%BC
在Firefox 3.5和Internet Explorer 8中转换为u
),我得到了不同的document.location.hash值:
- IE8:
#%C3%BC
- FF3.5:
#ü
有没有办法在两种浏览器中都获得一个变体?实际上,在我的Firefox版本(Linux上为3.5)中,如果我在URL中键入“#%C3%BC”作为散列,URL本身实际上会转换为带有“#ü”的unicode。但你似乎已经回答了自己的问题——在Firefox中,浏览器会在URL中转换实体转义码,而在IE中则不会
实际上,我的建议是:不要在URL中添加“#%C3%BC”,只需在哈希和URL中使用完整的unicode即可。这是一种选择吗?它在任何现代浏览器中都能正常工作。您可以使用,在所有情况下,它都会返回#
:
decodeURIComponent('#%C3%BC'); // #ü
decodeURIComponent('#ü'); // #ü
试试看。回答我自己的问题,我目前的解决方案是解析window.location.href
,而不是使用window.location.hash
,因为前者总是(即在每个浏览器中)url编码的。因此,建议的decodeURIComponent
功能CMS始终可以安全使用。YUI也是这样做的,因此不会有那么大的错误…不幸的是,这是Firefox中的一个错误,因为它解码位置。当访问它时,会额外花费一段时间对其进行哈希处理。例如,在Firefox中尝试以下操作:
location.hash = "#%30";
location.hash === "#0"; // This is wrong, it should be "#%30"
唯一的跨浏览器解决方案是只使用(location.href.split(“#”)来获取散列。使用location.hash
设置哈希似乎对所有支持location.hash
的浏览器都能正常工作。不,不是:(.你的Firefox(我的也一样)只是假装使用一个ü
字符。在HTTP中它总是使用百分比编码。将鼠标移到该链接上:。Firefox状态栏出于某种原因显示一个ü
。但是如果你使用HTTP嗅探器,你会发现它正在提交%C3%BC
。基本上,因为我使用的是HTTP红色直接来说,我不能直接使用unicode字符。你确定这不取决于编码是否为ASCII v unicode编码吗?如果没有百分比编码之类的特殊准备,就无法在HTTP中传输unicode字符(因为HTTP不允许字符超出ASCII范围)。这不是一个解决方案,因为:decodeURIComponent(“%2540”);//%40(即)
,但decodeURIComponent(“%40”);/@(FF)
不太清楚您的意思,%2540是编码的字符(%25
)和非编码的40
字符串,decodeURIComponent(“%40”)
是@在IE或Firefox中…假设我想使用哈希函数进行搜索,有人想搜索%40
(但不是@
)。根据他的浏览器,我会得到\%2540
(IE)或\%40
(FF)作为location.hash
。如果我解码它,我会在不同的浏览器中得到不同的结果。是的,这似乎是最合理的解决方案。这个测试至少在Firefox 10.0.1下返回false
。我不确定它何时更改,但当然如果你想支持旧版本,这仍然是最好的建议。如果hash零件本身包含一个“#”?在这种情况下,拆分方法将不起作用。感谢您的解决方案!请记住location.hash的输出有一个前导“#”,但location.href.split没有。@Christophe:可能的“#”在哈希本身中应该被编码为“%23”。为了更加确定,您显然可以使用location.href.split(“#”).splice(1).join(“#”)
。在这种情况下,甚至不需要添加| |“
,因为如果没有哈希,结果是空字符串。