【问题标题】:Encoding of window.location.hashwindow.location.hash的编码
【发布时间】:2009-11-09 20:27:15
【问题描述】:

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:

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

【问题讨论】:

    标签: javascript html url encoding fragment-identifier


    【解决方案1】:

    不幸的是,这是 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 的浏览器都有效。

    【讨论】:

    • 是的,这似乎是最合理的解决方案。
    • 这个测试至少在 Firefox 10.0.1 下返回false。我不确定它何时更改,但当然,如果您想支持旧版本,这仍然是最好的建议。
    • 如果哈希部分本身包含 # 怎么办?在这种情况下 split 方法将不起作用。
    • 感谢您的解决方案!请记住,location.hash 的输出有一个前导“#”,但 location.href.split 没有..
    • @Christophe:哈希本身中可能的“#”应该被编码为“%23”。为了更加确定,您显然可以使用location.href.split('#').splice(1).join('#')。在这种情况下,甚至不需要添加|| "",因为如果一开始没有散列,结果就是一个空字符串。
    【解决方案2】:

    回答我自己的问题,我当前的解决方案是解析window.location.href 而不是使用window.location.hash,因为前者总是(即在每个浏览器中)url 编码。因此建议的decodeURIComponent 函数CMS 总是可以安全使用。 YUI 也是这样,所以不会错……

    【讨论】:

      【解决方案3】:

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

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

      试试看here

      【讨论】:

      • 不是解决方案,因为:decodeURIComponent('%2540'); // %40 (IE)decodeURIComponent('%40'); // @ (FF)
      • 不太清楚你的意思,%2540 是 % 字符编码 (%25) 和非编码 40 字符串,decodeURIComponent('%40'); 在 IE 或 Firefox 中是 @ .. .jsbin.com/esafe
      • 假设我想将哈希用于搜索功能,并且有人想搜索%40(但不是@)。根据他的浏览器,我会得到#%2540 (IE) 或#%40 (FF) 作为location.hash。如果我解码它,我会在不同的浏览器中得到不同的结果。
      【解决方案4】:

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

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

      【讨论】:

      • 不,不是 :(。您的 Firefox(和我的也是)只是假装使用 ü 字符。在 HTTP 中,它总是使用百分比编码。将鼠标移到该链接上: test/%C3%BC。出于某种原因,Firefox 状态栏显示ü。但是如果您使用HTTP 嗅探器,您会发现它正在提交%C3%BC。基本上,因为我在HTTP 中使用那个重定向,反正我不能直接使用unicode字符。
      • 你确定这不依赖于 ASCII 和 unicode 编码的编码吗?
      • AFAIK 如果没有像百分比编码这样的特殊准备,就无法在 HTTP 中传输 unicode 字符(因为 HTTP 不允许 ASCII 范围之外的字符)。
      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 2016-01-22
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 2023-03-10
      • 2011-12-14
      相关资源
      最近更新 更多