Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.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 window.location.hash的编码_Javascript_Html_Url_Encoding_Fragment Identifier - Fatal编程技术网

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(“#”)
。在这种情况下,甚至不需要添加
| |“
,因为如果没有哈希,结果是空字符串。