0

我正在做一些重定向和返回网址的事情,我注意到一些时髦的东西。我在 Visual Studio 的即时窗口中运行了这行代码。

Uri.EscapeUriString("/z?x=y&w="+Uri.EscapeUriString("/a?b=c&d=e"))
"/z?x=y&w=/a?b=c&d=e"

好的,这看起来像是错误的逃脱。我的应用程序到底是如何知道 d 是查询字符串的一部分还是我想稍后重定向到的 url 的字符串的一部分。所以我尝试了 UnescapeDataString 并用谷歌搜索以防万一。

Uri.UnescapeDataString(Uri.EscapeDataString("a b+c"))
"a b+c"

事实证明我不应该使用它,因为它不会像它应该的那样将“+”解码到空间中

Uri.UnescapeDataString("ab+c")
"ab+c"

如果 UnescapeDataString 和 EscapeUriString 都不正确,那么我想怎么逃避 uri 呢?

4

2 回答 2

1

您可能想HttpUtility.UrlEncode尝试HttpUtility.UrlDecode

于 2013-01-22T01:41:37.367 回答
1

是的,HttpUtility.UrlEncode是要走的路。

这是一个例子。代码:

using System;
using System.Web;

namespace SO14450178
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Uri.EscapeUriString("/z?x=y&w="+Uri.EscapeUriString("/a?b=c&d=e")));
            string encoded = HttpUtility.UrlEncode("/z?x=y&w=" + HttpUtility.UrlEncode("/a?b=c&d=e"));
            Console.WriteLine(encoded);
            Console.WriteLine(HttpUtility.UrlDecode(encoded));
        }
    }
}

输出:

/z?x=y&w=/a?b=c&d=e
%2fz%3fx%3dy%26w%3d%252fa%253fb%253dc%2526d%253de
/z?x=y&w=%2fa%3fb%3dc%26d%3de

请注意,正如您所期望的那样,单个 Decode 仅解码两个 Encode 中的一个。

于 2013-01-22T01:54:34.223 回答