html空间显示为%2520而不是%20


109

将文件名传递到firefox浏览器会导致其用%2520 代替代替空格%20

我在名为的文件中包含以下HTML myhtml.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文件,以便浏览器可以找到我的图像?这里发生了什么?

Answers:


219

关于什么%2520是一些解释:

公用空格字符%20按照您自己的说明进行编码。的%字符被编码为%25

获得的方式%2520是当您的网址中已经有一个%20,然后再次进行urlencode,从而将转换%20%2520

您(或您可能使用的任何框架)是双重编码字符吗?

编辑: 对此进行扩展,特别是对于本地链接。假设您要链接到资源C:\my path\my file.html

  • 如果仅提供本地文件路径,则浏览器应在转换时对所有给定的字符进行编码和保护(在上述情况下,应使用所示的空格,因为%它是有效的文件名字符,因此将被编码)到正确的网址(请参阅下一点)。
  • 如果您提供带有file://协议的URL ,则基本上是在说明您已采取所有预防措施并对需要编码的内容进行了编码,其余应视为特殊字符。因此,在上述示例中,您应提供file:///c:/my%20path/my%20file.html。除了固定斜杠外,客户端不应在此处编码字符。

笔记:

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

1
Hexblot实际上是正确的。通常,当您通过编程对网址进行url编码时,就会发生这种情况,并且有一个漫游器进入并对其进行第二次编码。机器人有这样做的坏习惯。有两个可以解决此问题。1)您可以使用try或404或401尝试捕获异常,也可以编写一个小函数,该函数将对双解码值进行解码,然后再将其交给其他业务逻辑方法。
Ryan Watts

这帮助我弄清楚了为什么在发送jQuery ajax请求时得到它。我在ajax GET请求中设置了data属性,并在该值上设置了encodeURIComponent函数,但是jQuery在默认情况下已经做到了,因此为什么我得到%2520。真的很有帮助,谢谢。
Asher

chrome没有命令行参数来告诉它解释还是不解释链接?
AleX_

我将http://mysite/test & that... If I use UrlEncode更改为,http://mysite/test%20&%20that但是我也希望将&其更改为%26,所以这是mysite / test%20%26%20`我该怎么做?
Si8

10

由于某些(可能是有效的)原因,URL被编码了两次。%25是urlencoded %标志。因此原始网址看起来像:

http://server.com/my path/

然后它一次被urlencode:

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

和两次:

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

因此,在您的情况下,您不应该进行urlencoding 因为其他组件似乎已经为您服务。仅使用一个空间


我遇到了同样的问题,但是我不明白为什么默认urlencoding第一次被处理了两次。
jungwon jin

根据情况,双重编码可能是正确使用编码的完美有效结果。这个答案可能会给人一种印象,即双重编码总是错误的,并且您可以通过添加必要数量的“使它起作用”的编码/未编码调用来简单地解决编码问题。这是错误的,这就是编码错误首先出现的方式。-1
弗洛里安(Florian Winter)

@FlorianWinter我真的看不到您在两行之间读到的内容。你能帮我吗?(请阅读问题和我的回答)
hek2mgl

7

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

<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


0

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

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

而不是使用默认值,encodeURIComponent我的第一行代码将所有内容都转换spaceshyphens使用正则表达式模式/\s\g,而下一行则执行相反的操作,hyphens即将所有内容转换回spaces使用another regex pattern /-/g。这里/g实际上负责finding all匹配字符。

当我将此值发送到我的Ajax调用时,它遍历as normal spaces或简单地遍历%20,因此摆脱了double-encoding


1
我想是因为您没有解决问题,只是将其掩盖了-根本原因是它仍然存在于某个地方,并且您正在做双重工作(在某个地方您意外地编码了两次,而在其他地方您手动进行了解码以覆盖该问题。 )。假设您想“适当地”做事,最好的办法是调试并找到真正的罪魁祸首。
Nick Andriopoulos

实际上,无论我在哪里遇到问题,该解决方案都对我有效。所以我发布了。
Subrata Sarkar

2
@NiladriSarkar hexbolt试图说的是,尽管您的代码有效,但这不是可行的解决方案,而是肮脏的修复,应避免使用……
2Dee

-1

试试这个?

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


1
欢迎来到StackOverflow!通常,如果答案包含一些有关您的建议为什么可以解决OP问题的解释,而不仅仅是代码片段,则答案会更有用。另外,由于这个问题已经有一个可以接受的答案,所以最好添加一些解释,说明为什么您的答案比那个答案更正确。
DaveyDaveDave
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.