代码之家  ›  专栏  ›  技术社区  ›  huseyint

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

  •  39
  • huseyint  · 技术社区  · 17 年前

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

    更新: 检查 Rick Strahl's blog post 关于同一个问题。

    9 回复  |  直到 14 年前
        1
  •  72
  •   Igal Tabachnik    17 年前

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

    编码: 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=

        2
  •  7
  •   Lirrik    10 年前

    如果你正在使用。NET 4.0或更高版本,您可以使用 WebUtility.UrlDecode 它与客户端配置文件配合使用,也能正确处理加号。

        3
  •  4
  •   Marc Gravell    17 年前

    重新加载系统。Web.dll-正如其他人所指出的那样,除非你知道你需要处理可能没有它的客户端(“客户端配置文件”、“紧凑框架”、“微框架”和“silverlight”),否则不值得兴奋。

    再空间;真的不会很多;请注意。NET程序集是在逐个方法的基础上进行JIT的,因此仅使用几个方法不会产生任何显著的开销。

    真正的问题(IMO)是你对客户拥有系统的信心程度。Web.dll;如果你对他们使用完整的框架感到满意,那么就去做吧。

        4
  •  2
  •   Michał Powaga Mohamed Aslam    14 年前

    @史密斯
    我遇到了保存问题。没有变化,或者只是进一步的混乱。

    在测试了许多东西后,我注意到一个测试字符串确实解码了。最终,我必须创建一个新的空字符串,将其值设置为编码字符串,然后运行 WebUtility.HtmlDecode Uri.UnescapeDataString 由于某种原因,我不得不按照我提到的顺序运行解码和解压缩。奇怪的。

    我用这样的方法解决了这个问题。

    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)
    
        5
  •  0
  •   blowdart    17 年前

    Microsoft ACE团队在 Anti-XSS library 然而,我不确定它是否真的通过了。

    (老实说,我不明白你为什么那么担心对System.web.dll的依赖)

        6
  •  0
  •   user1228 user1228    17 年前

    你已经对有了极大的依赖。NET框架、CLR等。所以,事实上,您已经间接依赖于System。网状物。DLL;如果本地计算机上没有应用程序,则应用程序无法运行。

    你担心记忆力吗?你有记忆问题吗?如果你的内存问题如此严重,以至于无法将几KB的DLL加载到应用程序的内存中,那么你为什么要编码呢。网?还是你只是过早地进行了优化?

    所以不用担心。

        7
  •  0
  •   Chizl    7 年前

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

    系统。网。Web实用程序 (内部) + 65 :

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

    系统。网状物。实用。HttpEncoder实用程序 (内部)- + 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....

        8
  •  -3
  •   Michał Powaga Mohamed Aslam    14 年前

    在Android中,这个问题得到了解决,我花了几个小时才弄清楚,希望我现在能节省你的时间

    val objectRequest = GetObjectRequest(s3Uri.bucket, S3HttpUtils.urlDecode(s3Uri.key))
    
    推荐文章