几种HtmlEncode的区别
一、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", "
");
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("
");
}
所以手工的替换方法还是很有必要的,处理一些HtmlEncode不支持的替换。
public static string htmlencode(string str) { str.Replace("<", "<");
str.Replace(">", ">");
str.Replace(" ", " ");
str.Replace(" ", " ");
str.Replace("/'", "'");
str.Replace("/"", """);
str.Replace("/n", "
");
}
使用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中的编码和解码
一、escape/unescape escape:escape 方法返回一个包含 charstring 内容的字符串值(Unicode 格式)。所有空格、标点、 重音符号以及任何其他非 ASCII 字符都用 %xx 编码替换,其中 xx 等于表示该字符的十六进制数 unescape:从用 escape 方法编码的 String 对象中返回已解码的字符串 例外字符: @ * / + 二、encodeURI/decodeURI encodeURI:方法返回一个已编码的 URI。如果将编码结果传递给 decodeURI,则将返回初始的字符串。encodeURI 不对下列字符进行编码:“:”、“/”、“;
”和“?”。请使用 encodeURIComponent 对这些字符进行编码 decodeURI:从用encodeURI方法编码的String对象中返回已解码的字符串 例外字符:! @ # $ & * ( ) = : / ;
? + ' 三、encodeURIComponent/decodeURIComponent encodeURIComponent:encodeURIComponent 方法返回一个已编码的 URI。如果将编码结果传递给decodeURIComponent,则将返回初始的字符串。因为 encodeURIComponent 方法将对所有字符编码 decodeURIComponent:从用encodeURIComponent方法编码的String对象中返回已解码的字符串 例外字符:! * ( ) '
【几种HtmlEncode的区别】本文摘自:http://blog.joycode.com/ghj/archives/2010/02/26/115894.joy
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量