一、C#中的编码
HttpUtility.HtmlDecode、HttpUtility.HtmlEncode与Server.HtmlDecode、Server.HtmlEncode与HttpServerUtility.HtmlDecode、HttpServerUtility.HtmlEncode的区别?
它们与下面一般手工写的代码有什么区别?
[c-sharp] view plaincopy
- 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;
它们只不过是为了调用方便,进行了封装而已;
下面是一个非常简单的替换测试代码,测试结果看注释:
[c-sharp] view plaincopy
- 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不支持的替换。
[c-sharp] view plaincopy
- 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 的实现,我们就可以看到,它只考虑的五种情况,空格,回车是没有处理的:
[c-sharp] view plaincopy
- 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中的编码和解码
[c-sharp] view plaincopy
- 一、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对象中返回已解码的字符串
- 例外字符:! * ( ) '
.NET编码解码(HtmlEncode与HtmlEncode)
编码代码:
System.Web.HttpUtility.HtmlEncode("<a href=\"http://hovertree.com/\">何问起</a>");
解码代码:
System.Web.HttpUtility.HtmlDecode("<a href="http://hovertree.com/">何问起</a> ");
效果体验:http://tool.hovertree.com/htmlcode/
本工具还可以实现Unicode解码,例如可以把以下代码解码试试:
<a href="http://hovertree.com/">何问起,我爱你,就像老鼠爱大米。</a> 
详细实现:
Default.aspx
<%@ Page ValidateRequest="false" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="test_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>asp.net(C#) 编码解码(HtmlEncode与HtmlEncode)- 何问起</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="lblShow" runat="server" Text="Label"></asp:Label> <asp:TextBox ID="txtInput" runat="server" Height="194px" TextMode="MultiLine" Width="305px"></asp:TextBox> <asp:Button ID="btnOk" runat="server" Text="提交" OnClick="btnOk_Click" /></div> </form> </body> </html>
Default.aspx.cs
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; /***********************编码研究*********************** * 1.默认情况是不允许用户在TextBox中输入html标签的, * 如果需要输入,设置Page的ValidateRequest="false" * 2.可以把输入的html标签,比如<input>直接存放在数据库中, * 只是在输出的时候编码,防止原样输出打乱页面布局.或者呈现html元素. *****************************************************/ public partial class test_Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // http://sosoft.cnblogs.com/ } protected void btnOk_Click(object sender, EventArgs e) { lblShow.Text = htmlEncode(txtInput.Text); } /// <summary> /// 对输入的html编码,同时对回车与空格进行转换 /// </summary> /// <param name="str"></param> /// <returns></returns> public string htmlEncode(string str) { return Server.HtmlEncode(str).Replace("\n", "<br/>").Replace(" ", " "); } }