是否有任何函数可以将转义的Url字符串转换为未转义的形式? System.Web.HttpUtility.UrlDecode()
可以完成这项工作,但我不想添加对System.Web.dll
的引用。由于我的应用程序不是Web应用程序,因此我不想仅使用程序集中的函数添加依赖项。
更新:检查Rick Strahl's blog post是否存在同样的问题。
答案 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.HtmlDecode
和Uri.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¶m2=there@is<a space");
var test2 = HttpUtility.UrlEncode("http://www.test.com/?param1=22¶m2=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
答案 7 :(得分:-2)
System.Net.WebUtility.HtmlDecode
也在开发.NET 4.0 Client Profile。