Server.UrlEncode(string s)...没有

时间:2010-03-25 14:23:44

标签: c# .net javascript

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根本无法正常工作?

4 个答案:

答案 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客户端工作。