Uri.EscapeDataString很奇怪

时间:2014-07-25 18:44:49

标签: c# .net escaping .net-4.5 percent-encoding

为什么EscapeDataString在.NET 4和4.5之间表现不同?输出

  • Uri.EscapeDataString("-_.!~*'()") => "-_.!~*'()"

  • Uri.EscapeDataString("-_.!~*'()") => "-_.%21~%2A%27%28%29"

The documentation

  

默认情况下,EscapeDataString方法转换除了以外的所有字符   对于他们的十六进制的RFC 2396非保留字符   表示。如果是国际资源标识符(IRI)或   启用国际化域名(IDN)解析,   EscapeDataString方法转换除RFC 3986之外的所有字符   未保留的字符,以十六进制表示。所有   转义前,Unicode字符将转换为UTF-8格式。

作为参考,未预留的字符在RFC 2396

中定义如下
unreserved    = alphanum | mark

mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |
                (" | ")"

RFC 3986

ALPHA / DIGIT / "-" / "." / "_" / "~"

The source code

看起来EscapeDataString的每个字符是否被转义大致都是这样确定的

is unicode above \x7F
  ? PERCENT ENCODE
  : is a percent symbol
    ? is an escape char
      ? LEAVE ALONE
      : PERCENT ENCODE
    : is a forced character
      ? PERCENT ENCODE
      : is an unreserved character
        ? PERCENT ENCODE

最后一次检查"是一个毫无保留的角色"在RFC2396和RFC3986之间做出选择。方法的源代码是

    internal static unsafe bool IsUnreserved(char c)
    {
        if (Uri.IsAsciiLetterOrDigit(c))
        {
            return true;
        }
        if (UriParser.ShouldUseLegacyV2Quirks)
        {
            return (RFC2396UnreservedMarks.IndexOf(c) >= 0);
        }
        return (RFC3986UnreservedMarks.IndexOf(c) >= 0);
    }

该代码指的是

    private static readonly UriQuirksVersion s_QuirksVersion = 
        (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5
             // || BinaryCompatibility.TargetsAtLeast_Silverlight_V6
             // || BinaryCompatibility.TargetsAtLeast_Phone_V8_0
             ) ? UriQuirksVersion.V3 : UriQuirksVersion.V2;

    internal static bool ShouldUseLegacyV2Quirks {
        get {
            return s_QuirksVersion <= UriQuirksVersion.V2;
        }
    }

混乱

文档说EscapeDataString的输出取决于是否启用了IRI / IDN解析,而源代码表示输出由TargetsAtLeast_Desktop_V4_5的值确定,这似乎是矛盾的。有人可以解决这个问题吗?

1 个答案:

答案 0 :(得分:-1)

在系统功能及其行为方面,4.5与4.0相比已经做了很多改变。 你可以看一下这个帖子

Why does Uri.EscapeDataString return a different result on my CI server compared to my development machine?

你可以直接转到以下链接

http://msdn.microsoft.com/en-us/library/hh367887(v=vs.110).aspx

这一切都来自世界各地用户的意见。