将文件名传递给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文件以便浏览器可以找到我的图片?这是怎么回事?
答案 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路径中,但大多数客户端都可以将它们转换为正确的正斜杠。 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这是一个本地文件名,它会在浏览器中正确呈现图像,正确编码字符串一次。
答案 3 :(得分:2)
试试这个
file:///c:/Documents%20and%20Settings/screenshots/Image01.png
每当您尝试使用 cmd 或任何 html 标签在浏览器中打开本地文件时,请使用“file:///”并将空格替换为 %20(空格的 url 编码)
答案 4 :(得分:0)
以下代码段解决了我的问题。认为这可能对其他人有用。
var strEnc = this.$.txtSearch.value.replace(/\s/g, "-");
strEnc = strEnc.replace(/-/g, " ");
&#13;
而是使用默认encodeURIComponent
我的第一行代码是使用正则表达式模式spaces
将所有hyphens
转换为/\s\g
,而后续行只是反过来,即转换所有hyphens
使用其他spaces
返回regex pattern /-/g
。此处/g
实际上负责finding all
匹配字符。
当我将此值发送到我的Ajax调用时,它会以normal spaces
或%20
遍历,从而摆脱double-encoding
。