zoukankan      html  css  js  c++  java
  • (转)几种HtmlEncode的区别

    一、C#中的编码

    HttpUtility.HtmlDecode、HttpUtility.HtmlEncode与Server.HtmlDecode、Server.HtmlEncode与HttpServerUtility.HtmlDecode、HttpServerUtility.HtmlEncode的区别?

    它们与下面一般手工写的代码有什么区别?

    [c-sharp] view plaincopy
     
    1. public static string htmlencode(string str)  
    2. {  
    3.     if (str == null || str == "")  
    4.         return "";  
    5.   
    6.     str.Replace("<", "<");  
    7.     str.Replace(">", ">");  
    8.     str.Replace(" ", " ");  
    9.     str.Replace(" ", "  ");  
    10.     str.Replace("/"", """);  
    11.     str.Replace("/'", "'");  
    12.     str.Replace("/n", "<br/>");  
    13.   
    14.     return str;  
    15. }  

    答案:

    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
     
    1. protected void Page_Load(object sender, EventArgs e)  
    2. {  
    3.     TestChar("<");   //小于号        替换为      <         
    4.     TestChar(">");   //大于号        替换为      >  
    5.     TestChar(" ");    //英文半角空格        替换为      不做替换;  
    6.     TestChar(" ");  //中文全角空格        替换为      不做替换;  
    7.     TestChar("&");   //&        替换为      &  
    8.     TestChar("/'");   //单引号        替换为      ';  
    9.     TestChar("/"");   //双引号        替换为      "  
    10.     TestChar("/r");   //回车        替换为      不做替换;  
    11.     TestChar("/n");   //回车        替换为      不做替换;  
    12.     TestChar("/r/n");   //回车        替换为      不做替换;  
    13. }  
    14. protected void TestChar(String str)  
    15. {  
    16.     Response.Write(Server.HtmlEncode(str));  
    17.     Response.Write("----------------------");  
    18.     Response.Write(HttpUility.HtmlEncode(str));  
    19.     Response.Write("<br/>");  
    20. }  

    所以手工的替换方法还是很有必要的,处理一些HtmlEncode不支持的替换。

    [c-sharp] view plaincopy
     
    1. public static string htmlencode(string str)  
    2. {  
    3.     str.Replace("<", "<");  
    4.     str.Replace(">", ">");  
    5.     str.Replace(" ", " ");  
    6.     str.Replace(" ", " ");  
    7.     str.Replace("/'", "'");  
    8.     str.Replace("/"", """);  
    9.     str.Replace("/n", "<br/>");  
    10. }  

    使用Reflector 查看 HttpUttility.HtmlEncode 的实现,我们就可以看到,它只考虑的五种情况,空格,回车是没有处理的:

    [c-sharp] view plaincopy
     
    1. public static unsafe void HtmlEncode(string value, TextWriter output)  
    2. {  
    3.     if (value != null)  
    4.     {  
    5.         if (output == null)  
    6.         {  
    7.             throw new ArgumentNullException("output");  
    8.         }  
    9.         int num = IndexOfHtmlEncodingChars(value, 0);  
    10.         if (num == -1)  
    11.         {  
    12.             output.Write(value);  
    13.         }  
    14.         else  
    15.         {  
    16.             int num2 = value.Length - num;  
    17.             fixed (char* str = ((char*) value))  
    18.             {  
    19.                 char* chPtr = str;  
    20.                 char* chPtr2 = chPtr;  
    21.                 while (num-- > 0)  
    22.                 {  
    23.                     chPtr2++;  
    24.                     output.Write(chPtr2[0]);  
    25.                 }  
    26.                 while (num2-- > 0)  
    27.                 {  
    28.                     chPtr2++;  
    29.                     char ch = chPtr2[0];  
    30.                     if (ch <= '>')  
    31.                     {  
    32.                         switch (ch)  
    33.                         {  
    34.                             case '&':  
    35.                             {  
    36.                                 output.Write("&");  
    37.                                 continue;  
    38.                             }  
    39.                             case '/'':  
    40.                             {  
    41.                                 output.Write("'");  
    42.                                 continue;  
    43.                             }  
    44.                             case '"':  
    45.                             {  
    46.                                 output.Write(""");  
    47.                                 continue;  
    48.                             }  
    49.                             case '<':  
    50.                             {  
    51.                                 output.Write("<");  
    52.                                 continue;  
    53.                             }  
    54.                             case '>':  
    55.                             {  
    56.                                 output.Write(">");  
    57.                                 continue;  
    58.                             }  
    59.                         }  
    60.                         output.Write(ch);  
    61.                         continue;  
    62.                     }  
    63.                     if ((ch >= '/x00a0') && (ch < 'ā'))  
    64.                     {  
    65.                         output.Write("&#");  
    66.                         output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));  
    67.                         output.Write(';');  
    68.                     }  
    69.                     else  
    70.                     {  
    71.                         output.Write(ch);  
    72.                     }  
    73.                 }  
    74.             }  
    75.         }  
    76.     }  
    77. }   

    二、JS中的编码和解码

    [c-sharp] view plaincopy
     
    1. 一、escape/unescape  
    2.     escape:escape 方法返回一个包含 charstring 内容的字符串值(Unicode 格式)。所有空格、标点、 重音符号以及任何其他非 ASCII 字符都用 %xx 编码替换,其中 xx 等于表示该字符的十六进制数  
    3.     unescape:从用 escape 方法编码的 String 对象中返回已解码的字符串  
    4.     例外字符: @ * / +  
    5.   
    6. 二、encodeURI/decodeURI  
    7.     encodeURI:方法返回一个已编码的 URI。如果将编码结果传递给 decodeURI,则将返回初始的字符串。encodeURI 不对下列字符进行编码:“:”、“/”、“;”和“?”。请使用 encodeURIComponent 对这些字符进行编码  
    8.     decodeURI:从用encodeURI方法编码的String对象中返回已解码的字符串  
    9.     例外字符:! @ # $ & * ( ) = : / ; ? + '  
    10.   
    11. 三、encodeURIComponent/decodeURIComponent  
    12.     encodeURIComponent:encodeURIComponent 方法返回一个已编码的 URI。如果将编码结果传递给decodeURIComponent,则将返回初始的字符串。因为 encodeURIComponent 方法将对所有字符编码  
    13.     decodeURIComponent:从用encodeURIComponent方法编码的String对象中返回已解码的字符串  
    14.     例外字符:! * ( ) '  
  • 相关阅读:
    [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)
    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
    [.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术
    [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
    [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
    [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
    [.net 面向对象程序设计进阶] (10) 序列化(Serialization)(二) 通过序列化博客园文章学习XML的序列化
    [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化
    [.net 面向对象程序设计进阶] (8) 托管与非托管
    [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
  • 原文地址:https://www.cnblogs.com/wanshutao/p/4201452.html
Copyright © 2011-2022 走看看