2

在一些javascript中,我有:

var url = "find.aspx?" + "location=" + encodeURIComponent( address );
alert( url );
location.href = url;

其中地址的值是字符串“西雅图,华盛顿”。

在我看到的警报中

find.aspx?Seattle%2C%20WA

正如我所料。

但是在服务器端,当我查看 Request.Url 时,我看到的相关子字符串是

find.aspx?Seattle, WA

在 Firefox url 窗口中我看到

find.aspx?location=Seattle%2C WA

所以我得到了三种不同的表示,而我希望在所有三个地方我都应该看到我在警报中看到的内容。我的期望是我分配给 location.href 的 url 应该在浏览器 url 窗口中按原样显示,并且应该在 Request.Url 中按原样传递给服务器(我需要解码服务器上的值在使用它们之前)。发生了什么?

4

3 回答 3

2

Firefox 将某些编码字符转换为其文字形式,作为对用户友好的一种方式。它还将地址栏中输入的空格转换服务器的 %20。

更新:Firefox 不显示未编码逗号的原因是因为 URL 中允许使用逗号,但不允许使用空格,因此它知道空格将被明确解释,而预编码的逗号不同于非一些服务器的编码逗号。请参阅:我可以在 URL 中使用逗号吗?

ASP 可能试图通过为您自动取消编码字符串来帮助您。

更新:默认情况下,看起来 ASP.NET 会为您取消编码 Request.Url,如此处所述:URLDecode 后的 QueryString 格式错误他们还提到您可以HttpRequest.Url.Query用来访问未解码的版本。

警报是唯一没有为您做任何“魔术”的事情。

于 2010-01-22T07:52:32.600 回答
1

对于警报,您正在自己进行编码。如果您删除了encodeURIComponent.

在服务器端,ASP.NET 将始终向您显示未编码的形式。这是为了更容易直接映射到也具有需要(未)编码的文本的文件。

请注意,您可以在 URL 编码中将每个字母替换为 UTF8 表示。它仍然是相同的 URL。即,在浏览器窗口中键入以下内容,它仍然可以工作:%66%59%6E%64.aspx?location=Seattle%2C%20WA. 要仅对必要的字符进行编码,如果您自己创建链接,请在服务器端使用UrlEncode 。

URL 编码会变得相当棘手。你要求解释一下。要知道某个字符的正确转义,您需要知道该字符在 UTF8 中的外观。UTF-8 字节的十六进制值将成为您的字母的 %XX%YY 值。有时它是一个 %XX,但总共最多可以是六个字节序列(例如一些汉字)。

URL 编码仅以一种方式工作。切勿双重编码或双重未编码。这是规范禁止的。此外,因为您可以对任何字符进行编码,所以(正如您所发现的)并不总是可以进行往返编码/取消编码。如果您再次取消编码并重新编码,则结果字符串很可能不同,但语法相同。

在 HTML 中,URL编码有时会穿插 HTML 编码。即,& 符号在 HTML 中有效,但在 HTML 中无效。find.aspx?city=A&name=B变成find.aspx?city=A&name=B和 HTML URL。但是,浏览器很宽松,会接受错误的 HTML 编码字符串。

最后,不在浏览器上:如果您在链接中输入空格,即使在<a>标签内,它也会为您转义空格(或其他字符)。同样,现在它会在地址栏中显示奇数字符(é、ï 等),但是当它通过 HTTP 发送时,浏览器会正确地为您进行编码。


更新:关于回答您需要“明确”参考或证明的问题。

虽然我在互联网上找不到任何东西,但我决定自己使用 Reflector 寻找它。通过设置的方法,例如,HttpRequest.QueryString您很快就会遇到HttpRequest.FillInQueryStringCollection然后调用的私有方法HttpValueCollection.FillfromEncodedBytes。在该方法的末尾附近,HttpUtility.UrlDecode调用了这些值。结论:不要自己调用,防止双重解码。

当您下载Reflector并反汇编 System.Web 的 .NET 库时,您可以自己看到这一点。

于 2010-01-22T08:08:04.130 回答
0

对于您的示例,您可以更改此行

var url = "find.aspx?" + "location=" + encodeURIComponent( address );

var url = "find.aspx?" + "location=" + address;

并按原样查看地址。但是,如果地址变量包含任何“&”字符,则您的变量将被损坏。因此,您正在使用 encodeURIComponent 对这些东西 url 进行编码。

在服务器端,所有这些编码的字符串都被解码回来。这意味着 encodeURIComponent 仅用于将地址变量(无论是否包含 & 字符)正确发送到服务器端。

于 2010-01-22T07:57:43.780 回答