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

时间:2013-04-18 13:55:30

标签: html url filenames url-encoding

将文件名传递给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文件以便浏览器可以找到我的图片?这是怎么回事?

5 个答案:

答案 0 :(得分:188)

%2520的内容进行了一些解释:

您自己注意到,公共空间字符编码为%20%字符编码为%25

获得%2520的方式是,当您的网址中已包含%20时,会再次进行urlencoded,从而将%20转换为%2520

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

修改 对此进行了扩展,特别是对于 LOCAL 链接。假设您要链接到资源C:\my path\my file.html

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

注意:

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

答案 1 :(得分:9)

对于某些 - 可能有效 - 导致网址被编码两次。 %25是urlencoded %标志。所以原始网址看起来像:

http://server.com/my path/

然后它被urlencoded一次:

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

两次:

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

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

答案 2 :(得分: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

答案 3 :(得分:2)

试试这个

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

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

答案 4 :(得分:0)

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

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

而是使用默认encodeURIComponent我的第一行代码是使用正则表达式模式spaces将所有hyphens转换为/\s\g,而后续行只是反过来,即转换所有hyphens使用其他spaces返回regex pattern /-/g。此处/g实际上负责finding all匹配字符。

当我将此值发送到我的Ajax调用时,它会以normal spaces%20遍历,从而摆脱double-encoding