为什么EscapeDataString在.NET 4和4.5之间表现不同?输出
Uri.EscapeDataString("-_.!~*'()") => "-_.!~*'()"
Uri.EscapeDataString("-_.!~*'()") => "-_.%21~%2A%27%28%29"
默认情况下,EscapeDataString方法转换除了以外的所有字符 对于他们的十六进制的RFC 2396非保留字符 表示。如果是国际资源标识符(IRI)或 启用国际化域名(IDN)解析, EscapeDataString方法转换除RFC 3986之外的所有字符 未保留的字符,以十六进制表示。所有 转义前,Unicode字符将转换为UTF-8格式。
作为参考,未预留的字符在RFC 2396:
中定义如下unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" |
(" | ")"
在RFC 3986:
ALPHA / DIGIT / "-" / "." / "_" / "~"
看起来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
的值确定,这似乎是矛盾的。有人可以解决这个问题吗?
答案 0 :(得分:-1)
在系统功能及其行为方面,4.5与4.0相比已经做了很多改变。 你可以看一下这个帖子
或
你可以直接转到以下链接
http://msdn.microsoft.com/en-us/library/hh367887(v=vs.110).aspx
这一切都来自世界各地用户的意见。