【问题标题】:A html space is showing as %2520 instead of %20html 空间显示为 %2520 而不是 %20
【发布时间】:2013-04-11 16:26:16
【问题描述】:

将文件名传递给 Firefox 浏览器会导致其将空格替换为 %2520 而不是 %20。

我在一个名为 myhtml.html 的文件中有以下 HTML:

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

当我将myhtml.html 加载到 Firefox 中时,图像显示为损坏的图像。所以我右键点击链接查看图片,它显示了这个修改后的 URL:

file:///c:/Documents%2520and%2520Settings/screenshots/Image01.png
                    ^
                    ^-----Firefox changed my space to %2520.

什么鬼?它把我的空间变成了%2520。它不应该将其转换为%20 吗?

如何更改此 HTML 文件以便浏览器可以找到我的图像?这是怎么回事?

【问题讨论】:

    标签: html url filenames url-encoding


    【解决方案1】:

    试试这个

    file:///c:/Documents%20and%20Settings/screenshots/Image01.png
    

    当您尝试使用 cmd 或任何 html 标签在浏览器中打开本地文件时,请使用“file:///”并将空格替换为 %20(空格的 url 编码)

    【讨论】:

      【解决方案2】:

      由于某些(可能是有效的)原因,url 被编码了两次。 %25 是 urlencoded % 符号。所以原始网址看起来像:

      http://server.com/my path/
      

      然后它被 urlencoded 一次:

      http://server.com/my%20path/
      

      两次:

      http://server.com/my%2520path/
      

      所以你不应该做 urlencoding - 在你的情况下 - 因为其他组件似乎已经适合你了。只使用一个空格

      【讨论】:

      • 我遇到了同样的问题,但我不明白为什么默认的 urlencoding 在第一次被处理了两次。
      • 视情况而定,双重编码可能是正确使用编码的完全有效结果。这个答案可能会造成双重编码总是错误的印象,并且您可以通过添加尽可能多的编码/取消编码调用来“使其工作”来简单地解决编码问题。这是错误的,这就是编码错误首先出现的原因。 -1
      • @FlorianWinter 我真的看不出你在字里行间读到的地方。你能帮我吗? (请阅读问题和我的回答)
      【解决方案3】:

      试试这个?

      encodeURIComponent('space word').replace(/%20/g,'+')

      【讨论】:

      • 欢迎来到 StackOverflow!通常,如果答案包含一些关于为什么您的建议将解决 OP 问题的解释,而不仅仅是代码 sn-p,则答案会更有用。此外,由于这个问题已经有一个公认的答案,因此最好添加一些解释,说明为什么您的答案比那个答案更正确。
      【解决方案4】:

      解释一下%2520 是什么:

      公共空格字符编码为%20,正如您自己指出的那样。 % 字符被编码为%25。

      您获得%2520 的方式是当您的网址中已经有一个%20,然后再次进行urlencoded,这会将%20 转换为%2520。

      您(或您可能正在使用的任何框架)是否对字符进行双重编码?

      编辑: 对此进行了一些扩展,尤其是对于 LOCAL 链接。假设你想链接到资源C:\my path\my file.html:

      • 如果你只提供一个本地文件路径,浏览器应该编码和保护所有给定的字符(在上面,你应该用空格给它,因为%是一个有效的文件名字符,因此它将被编码)转换为正确的 URL 时(见下一点)。
      • 如果你提供一个带有file://协议的URL,你基本上是在声明你已经采取了所有的预防措施并且编码了需要编码的东西,其余的应该被视为特殊字符。因此,在上面的示例中,您应该提供file:///c:/my%20path/my%20file.html。除了修正斜线之外,客户端不应在此处对字符进行编码。

      注意事项:

      • 斜杠方向 - 正斜杠 / 用于 URL,反斜杠 \ 用于 Windows 路径,但大多数客户端都可以通过将它们转换为正确的正斜杠来使用它们。
      • 此外,协议名称后面有 3 个斜杠,因为您在静默地引用当前机器而不是远程主机(完整的未缩写路径为 file://localhost/c:/my%20path/my%file.html),但同样大多数客户端将在没有主机的情况下工作部分(即只有两个斜杠),假设您指的是本地计算机并添加第三个斜杠。

      【讨论】:

      • Hexblot 在这里实际上是正确的。通常,当您通过编程重新对您的 url 进行 url 编码时,就会发生这种情况,并且机器人进入并对其进行第二次编码。机器人有这样做的坏习惯。有两个是你可以处理这个问题的。 1)您可以使用 try catch 异常处理 404 或 401,或者您可以编写一个小函数,在将双解码值交给另一个业务逻辑方法之前对其进行解码。
      • 这帮助我弄清楚为什么我在发送 jQuery ajax 请求时会收到它。我在 ajax GET 请求中使用 encodeURIComponent 函数在值上设置数据属性,但 jQuery 默认情况下已经这样做了,因此我得到了 %2520。真的很有帮助,谢谢。
      • chrome没有命令行参数来告诉它解释还是不解释链接?
      • 我有 http://mysite/test &amp; that... If I use UrlEncode` 它更改为 http://mysite/test%20&amp;%20that 但我也希望 &amp; 也更改为 %26 所以它是 mysite/test%20%26%20that` 我该怎么做?跨度>
      • 另一种可能发生这种情况的情况是,如果您有文件名包含 %20 的文件(如果它们是从浏览器中保存的,并且在编写脚本来抓取网站时也会发生这种情况,这很常见),然后您提供他们通过像apache这样的网络服务器。在这种情况下,您实际上需要使用二级编码在 URL 中引用它们。您可以通过在保存文件名时对文件名进行 url 解码来防止这种情况发生,或者事后分批进行。
      【解决方案5】:

      以下代码 sn-p 解决了我的问题。认为这可能对其他人有用。

      var strEnc = this.$.txtSearch.value.replace(/\s/g, "-");
      strEnc = strEnc.replace(/-/g, " ");

      而不是使用默认的encodeURIComponent 我的第一行代码是使用正则表达式模式/\s\g 将所有spaces 转换为hyphens,下面的行正好相反,即将所有hyphens 转换回spaces使用另一个regex pattern /-/g。这里/g实际上是负责finding all匹配字符。

      当我将此值发送到我的 Ajax 调用时,它会作为normal spaces 或简单地%20 遍历,从而摆脱double-encoding。

      【讨论】:

      • 我认为是因为您没有解决问题,只是掩盖了它-根本原因它仍然存在于某处,并且您正在做双重工作(在某处您不小心编码了两次,而在其他地方您'正在手动解码以掩盖它)。假设您想“正确地”做事,最好的办法是调试并找到真正的罪魁祸首。
      • 实际上,无论我遇到此问题,该解决方案都对我有用。所以我发了。
      • @NiladriSarkar hexbolt 想说的是,虽然你的代码可以工作,但它不是一个可行的解决方案,而是一个肮脏的修复,应该避免......
      • 这是一个肮脏的修复还是只是一个修复?当您使用不检查双重编码的框架(如 NSURL ...)时,实现自己的编码也可以称为 sanity-saver。
      • 其实NSURL的absoluteString确实暴露了双重编码的问题,但是NSURL的path没有。
      【解决方案6】:

      当您尝试通过 Firefox 浏览器访问本地文件名时,您必须强制使用 file:\\\ 协议 (http://en.wikipedia.org/wiki/File_URI_scheme),否则 firefox 会对您的空间进行两次编码。从此更改html sn-p:

      <img src="C:\Documents and Settings\screenshots\Image01.png"/>
      

      到这里:

      <img src="file:\\\C:\Documents and Settings\screenshots\Image01.png"/>
      

      或者这个:

      <img src="file://C:\Documents and Settings\screenshots\Image01.png"/>
      

      然后通知firefox这是一个本地文件名,它在浏览器中正确渲染图像,正确编码一次字符串。

      有用的链接:http://support.mozilla.org/en-US/questions/900466

      【讨论】:

        猜你喜欢
        • 2016-04-04
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多