在不使用HttpUtility.UrlDecode的情况下解码转义的Url

时间:2008-10-27 11:05:46

标签: .net url

是否有任何函数可以将转义的Url字符串转换为未转义的形式? System.Web.HttpUtility.UrlDecode()可以完成这项工作,但我不想添加对System.Web.dll的引用。由于我的应用程序不是Web应用程序,因此我不想仅使用程序集中的函数添加依赖项。

更新:检查Rick Strahl's blog post是否存在同样的问题。

8 个答案:

答案 0 :(得分:61)

编辑:使用静态方法 Uri.UnescapeDataString() 解码您的网址:

编码: http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d

已解码: http://www.google.com/search?hl=en&q=something #23&btnG=Google+Search&aq=f&oq=

答案 1 :(得分:6)

如果您使用的是.NET 4.0或更高版本,则可以使用适用于客户端配置文件的WebUtility.UrlDecode,并正确处理加号(请参阅this讨论)。

答案 2 :(得分:4)

重新加载System.Web.dll - 正如其他人所说的那样,除非你知道你需要处理可能没有它的客户端(“客户端配置文件”,“紧凑框架”, “微观框架”,“银光”)。

Re space;它真的不会很多;请注意,.NET程序集是逐个方法进行JIT的,因此使用一些方法不会产生任何重大开销。

真正的问题(IMO)是您对客户端具有System.Web.dll的信心。如果您对使用完整框架感到高兴,那就去吧。

答案 3 :(得分:1)

@Smith
我遇到了保存问题。没有变化或只是进一步的混乱。

在测试了很多东西后,我注意到测试字符串确实解码了。最终我必须创建一个新的空字符串,将其值设置为编码字符串,然后在新字符串上运行WebUtility.HtmlDecodeUri.UnescapeDataString。出于某种原因,我必须按照我提到的顺序运行解码和unescape。奇异。

我用这样的东西解决了它。

Dim strEncoded as string="http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d"

Dim strDecoded as string = ""
strDecoded = strEncoded
strDecoded = WebUtility.HtmlDecode(strDecoded)
strDecoded = Uri.UnescapeDataString(strDecoded)

答案 4 :(得分:0)

Microsoft ACE团队在Anti-XSS library中有一个扩展(更好)的解码版本。但是我不确定它是否只是通过了。

(我不明白为什么你担心对System.web.dll的依赖是诚实的)

答案 5 :(得分:0)

你已经对.NET框架,CLR等人有了巨大的依赖。所以,事实上,你已经对System.Web.DLL有间接依赖;如果您的应用程序无法在本地计算机上运行,​​则无法运行。

你担心记忆吗?你有记忆问题吗?如果您的内存问题如此极端,您无法将几KB的DLL加载到应用程序的内存中,那么为什么要编写.NET?或者你只是过早地优化?

所以不要担心。

答案 6 :(得分:0)

只需稍微了解一下为什么会有所不同。是转换为大写,一个转换为小写。因此,解码是特定于编码类型的。

System.Net.WebUtility (内部) + 65

private static char IntToHex(int n)
{
    if (n <= 9)
        return (char) (n + 48);
    else
        return (char) (n - 10 + 65);
}

System.Web.Util.HttpEncoderUtility (内部)- + 97

public static char IntToHex(int n)
{
    if (n <= 9)
        return (char) (n + 48);
    else
        return (char) (n - 10 + 97);
}

示例

var test1 = WebUtility.UrlEncode("http://www.test.com/?param1=22&param2=there@is<a space");
var test2 = HttpUtility.UrlEncode("http://www.test.com/?param1=22&param2=there@is<a space");

响应

test1 -> http%3A%2F%2Fwww.test.com%2F%3Fparam1%3D22%26param2%3Dthere%40is%3Ca+space
test2 -> http%3a%2f%2fwww.test.com%2f%3fparam1%3d22%26param2%3dthere%40is%3ca+space

More information....

答案 7 :(得分:-2)

System.Net.WebUtility.HtmlDecode也在开发.NET 4.0 Client Profile。