标签:
一、C#中的编码
HttpUtility.HtmlDecode、HttpUtility.HtmlEncode与Server.HtmlDecode、Server.HtmlEncode与HttpServerUtility.HtmlDecode、HttpServerUtility.HtmlEncode的区别?
它们与下面一般手工写的代码有什么区别?
public static string htmlencode(string str) { if (str == null || str == "") return ""; str.Replace("<", "<"); str.Replace(">", ">"); str.Replace(" ", " "); str.Replace(" ", " "); str.Replace("/"", """); str.Replace("/‘", "‘"); str.Replace("/n", "<br/>"); return str; }
答案:
HtmlEncode:是将html源文件中不容许出现的字符进行编码,通常是编码以下字符:"<"、">"、"&"、"""、"‘"等;
HtmlDecode:跟HtmlEncode恰好相反,是解码出原来的字符;
HttpServerUtility实体类的HtmlEncode(HtmlDecode)的简便方式,用于在运行时从ASP.NET Web应用程序访问System.Web.HttpUtility.HtmlEncode(HtmlDecode)方法,HttpServerUtility实体类的HtmlEncode(HtmlDecode)方法在内部是使用System.Web.HttpUtility.HtmlEncode(HtmlDecode)方法对字符进行编码(解码)的;
Server.HtmlEncode(Server.HtmlDecode)其实是System.Web.UI.Page类封装了HttpServerUtility实体类的HtmlEncode(HtmlDecode)的方法;
System.Web.UI.Page类有这样一个属性:public HttpServerUtility Server{get;}
所以可以认为:
Server.HtmlEncode=HttpServerUtility实体类的HtmlEncode方法=HttpUtility.HtmlEncode;
Server.HtmlDecode=HttpServerUtility实体类的HtmlDecode方法=HttpUtility.HtmlDecode;
它们只不过是为了调用方便,进行了封装而已;
下面是一个非常简单的替换测试代码,测试结果看注释:
protected void Page_Load(object sender, EventArgs e) { TestChar("<"); //小于号 替换为 < TestChar(">"); //大于号 替换为 > TestChar(" "); //英文半角空格 替换为 不做替换; TestChar(" "); //中文全角空格 替换为 不做替换; TestChar("&"); //& 替换为 & TestChar("/‘"); //单引号 替换为 ‘; TestChar("/""); //双引号 替换为 " TestChar("/r"); //回车 替换为 不做替换; TestChar("/n"); //回车 替换为 不做替换; TestChar("/r/n"); //回车 替换为 不做替换; } protected void TestChar(String str) { Response.Write(Server.HtmlEncode(str)); Response.Write("----------------------"); Response.Write(HttpUility.HtmlEncode(str)); Response.Write("<br/>"); }
所以手工的替换方法还是很有必要的,处理一些HtmlEncode不支持的替换。
public static string htmlencode(string str) { str.Replace("<", "<"); str.Replace(">", ">"); str.Replace(" ", " "); str.Replace(" ", " "); str.Replace("/‘", "‘"); str.Replace("/"", """); str.Replace("/n", "<br/>"); }
使用Reflector 查看 HttpUttility.HtmlEncode 的实现,我们就可以看到,它只考虑的五种情况,空格,回车是没有处理的:
public static unsafe void HtmlEncode(string value, TextWriter output) { if (value != null) { if (output == null) { throw new ArgumentNullException("output"); } int num = IndexOfHtmlEncodingChars(value, 0); if (num == -1) { output.Write(value); } else { int num2 = value.Length - num; fixed (char* str = ((char*) value)) { char* chPtr = str; char* chPtr2 = chPtr; while (num-- > 0) { chPtr2++; output.Write(chPtr2[0]); } while (num2-- > 0) { chPtr2++; char ch = chPtr2[0]; if (ch <= ‘>‘) { switch (ch) { case ‘&‘: { output.Write("&"); continue; } case ‘/‘‘: { output.Write("‘"); continue; } case ‘"‘: { output.Write("""); continue; } case ‘<‘: { output.Write("<"); continue; } case ‘>‘: { output.Write(">"); continue; } } output.Write(ch); continue; } if ((ch >= ‘/x00a0‘) && (ch < ‘ā‘)) { output.Write("&#"); output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo)); output.Write(‘;‘); } else { output.Write(ch); } } } } } }
二、JS中的编码和解码
标签:
原文地址:http://www.cnblogs.com/MirageFox/p/4814164.html