对于警报,您正在自己进行编码。如果您删除了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 库时,您可以自己看到这一点。