Server.UrlEncode(“My File.doc”)返回“My + File.doc”,而javascript escape(“My File.doc”)返回“My%20File.doc”。据我所知,javascript是corectly URL编码字符串而.net方法不是。它实际上似乎在实践中以这种方式工作,http://somesite/My+File.doc无法获取“My File.doc”,无论如何我都可以使用firefox / ie进行测试。和IIS,而http://somesite/My%20File.doc工作正常。我错过了什么或者Server.UrlEncode根本无法正常工作?
答案 0 :(得分:7)
使用Javascripts encodeURIComponent() / decodeURIComponent()与.Net的URLEncode / URLDecode进行“往返”编码。
修改强>
据我所知,历史上,“+”在URL编码中被用作空格char(ASCII 20)的特殊替换。如果一个实现没有将空间考虑为带有'+'替换的特殊字符,那么它仍然必须使用其ASCII代码(因此'%20')来逃避它。
http://bytes.com/topic/php/answers/5624-urlencode-vs-rawurlencode对情况进行了非常好的讨论。顺便说一句,这是不确定的。 RFC 2396将空间与其他字符混为一谈,没有无保留的表示,其中有'%20'人群。
RFC 1630支持'+'人群(通过论坛讨论)......
在查询字符串中,加号 保留为简写符号 空间。因此,真正的加号 必须被编码。使用该方法 使查询URI更容易传入 不允许空间的系统。
此外,核心RFC是......
RFC 1630 - WWW中的通用资源标识符
RFC 1738 - 统一资源定位器(URL)
RFC 2396 - 统一资源标识符(URI):通用语法
答案 1 :(得分:4)
据我所知,javascript是编码字符串的核心URL,而.net方法不是
实际上他们都错了!
永远不应使用JavaScript escape()
。除了无法将+
字符编码为%2B
之外,它还将所有非ASCII字符编码为非标准%uNNNN
序列。
同时Server.UrlEncode
并不完全是URL编码,而是编码为application/x-www-form-urlencoded
,这通常只应用于查询参数。使用+
表示形式name=value
构造之外的空格(例如路径部分)是错误的。
这是相当不幸的。在编码为路径部分而不是参数时,您可能希望在使用+
进行编码后尝试使用%20
字符替换UrlEncode()
字符。在参数中,+
和%20
同样不错。
答案 2 :(得分:3)
+
而不是空格是正确的URL编码,将其转义为%20。请参阅this文章(Perl中的CGI编程 - URL编码)。
+
不是JavaScript可以解析的内容,因此javascript将会占用空间或+
转移到%20
。
答案 3 :(得分:2)
使用System.Uri.EscapeDataString()
服务器端和decodeURIComponent
客户端工作。