WebUtility 的命名空间是 System.Net , HttpUtility 的命名空间是 System.Web ,它们都有 HtmlEncode/HtmlDecode 与 UrlEncode 与 UrlDecode 方法
我猜:System.Web的一般是服务端用,System.Net的一般是客户端用,是fcl中两个较大的范畴划分,不适宜并到一个程序集里。对于一些两端都可能用到的东西,一种办法是单独写到一个程序集里,比如叫System.Net.Common.dll之类,然后web和net共同引用它;另一种就是各自放一份,显然MS选择的是这种,也许是共用部分量不大,不值得单独弄个dll。
HttpUtility 里边的 HtmlEncode/HtmlDecode
调用的也是System.Net 的WebUtility.HtmlEncode/HtmlDecode
源码:
HttpUtility
public static string HtmlDecode(string s) => HttpEncoder.HtmlDecode(s);
internal static string HtmlEncode(string value) => string.IsNullOrEmpty(value) ? value : WebUtility.HtmlEncode(value);
HtmlEncode
也是一样的。
关于UrlEncode
和UrlDecode
感觉是两个人写了两份。原因目前也没找到为什么这么写。
HttpUtility
的UrlEncode
if (ch <= '<')
{
switch (ch)
{
case '<':
output.Write("<");
break;
case '"':
output.Write(""");
break;
case '\'':
output.Write("'");
break;
case '&':
output.Write("&");
break;
default:
output.Write(ch);
break;
}
}
else
{
output.Write(ch);
}
而WebUtility
的UrlEncode
if (ch <= '>')
{
switch (ch)
{
case '<':
output.Append("<");
break;
case '>':
output.Append(">");
break;
case '"':
output.Append(""");
break;
case '\'':
output.Append("'");
break;
case '&':
output.Append("&");
break;
default:
output.Append(ch);
break;
}
感觉还是WebUtility
处理的方式好一点
我猜一楼说得对
https://msdn.microsoft.com/en-us/library/ee388354(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.web.httputility(v=vs.110).aspx
(1) System.Web.HttpUtility 当进行Web请求时提供URL编码解码的方法,不能被继承
备注:此类被HttpServerUtility内置。但是HttpUtility类包含encoding和decoding方法,Server Object无法使用。
Web应用程序之外的编解码,使用WebUtility类。
(2) System.Net.WebUtility 当进行Web请求时提供URLs编码和解码的方法
备注:HttpUtility包含为HTML编码的字串编码解码的方法,System.Uri类也包含为同样目的的方法和属性
System.Net.WebUtility.HtmlDecode 解码因HTTP传输而HTML编码的字串 注意:如果字符如空格和标点在Http流中传递过来,他们有可能在接收的末尾被错误解码。HTML编码转换那些HTML中不允许的字符成等价的字符实体;HTML解码与编码反向。例如,当内置一个文字块,字符<和>被编码成<和>来进行HTTP传输。若参数值null,解码返回null,若值空,解码也为空。
System.Net.WebUtility.UrlDecode 把在URL里因传输而编码的字串解码 注意:如果字符如空格和标点在Http流中传递过来,他们有可能在接收的末尾被错误解码。URL编码转换那些URL中不允许的字符成等价的16进制转义序列;UrlEncode生成一个URL编码串。URL解码用相应的ASCII字符替换十六进制转义序列,例如,URL编码块,转义序列%3c和%3e被解码成<和>。