如何使用C#解码URL参数?

175

我该如何使用C#解码已编码的URL参数?

例如,考虑以下URL:

my.aspx?val=%2Fxyz2F

嘿,汤姆,因为帖子被删除了,所以不能在实际帖子上问了,但是你有没有找到解决方法,解决最新的Chrome 117.0.5938.89无法正确打印HTML页面的问题,因为缩放差异引起的? - undefined
1
请在Chrome中为一个错误票投票以解决它。 - undefined
1
是的,我们追踪到了并为其投票。谢谢。 - undefined
5个回答

350
string decodedUrl = Uri.UnescapeDataString(url)
或者
string decodedUrl = HttpUtility.UrlDecode(url)

URL未经完全解码。要完全解码,您可以在循环中调用以下方法之一:

private static string DecodeUrlString(string url) {
    string newUrl;
    while ((newUrl = Uri.UnescapeDataString(url)) != url)
        url = newUrl;
    return newUrl;
}

@ogi 谢谢!我不知道只调用一次不完全起作用!我运行了两次 Uri.UnescapeDataString,得到了我想要的结果!! :D - J05H
3
我认为这个答案比被接受的答案更好,因为你的第一个建议同样适用于可移植类库(PCLs)。 - Daniel Veihelmann
3
最佳答案!但在完全解码之前考虑你的参数嵌套方式。例如,参数值可能是一个编码的 URL,它本身具有另一个编码的 URL 的参数。如果你一次完全解码,就无法再区分哪个是哪个了。这就像从代数表达式中拔掉所有括号一样。如果你完全取消转义,组件的含义可能会丢失。例如 a=((b+c)d),如果你完全取消转义,组件的含义可能会变成 a=b+cd。 - DanO
4
UnescapeDataString不足以处理多种情况(例如URL中包含空格的参数使用'+',但UnescapeDataString有意不将其转换为空格)。Uri不仅仅处理URL,由于问题是关于URL的,因此我们应该使用HttpUtility.UrlDecode。 - Lorenz03Tx

112
Server.UrlDecode(xxxxxxxx)

3
哪个命名空间? - polina-c
2
@PolinaC System.Web.HttpServerUtilityBase,但在ASP.NET MVC中应该已经被导入了。 - Filnor

81

1
要访问HttpServerUtility.UrlDecode这个实例方法,应该使用HttpContext.Current.Server.UrlDecode - BornToCode

32

尝试:

var myUrl = "my.aspx?val=%2Fxyz2F";
var decodeUrl = System.Uri.UnescapeDataString(myUrl);

29

试一试这个:

string decodedUrl = HttpUtility.UrlDecode("my.aspx?val=%2Fxyz2F");

我收到:使用提供程序“EncryptionProvider”解密失败。提供程序返回的错误消息:无法打开RSA密钥容器。 - Allan F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接