zoukankan      html  css  js  c++  java
  • C# 几种HtmlEncode的区别

    一、C#中的编码

    HttpUtility.HtmlDecodeHttpUtility.HtmlEncodeServer.HtmlDecode、Server.HtmlEncodeHttpServerUtility.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.     例外字符:! * ( ) '  

    本文摘自:http://blog.joycode.com/ghj/archives/2010/02/26/115894.joy

  • 相关阅读:
    一些你可能用到的代码
    iOS 键盘下去的方法
    iOS设计模式汇总
    随笔
    Spring cloud config 分布式配置中心 (三) 总结
    Spring cloud config 分布式配置中心(二) 客户端
    Spring cloud config 分布式配置中心(一) 服务端
    jdbcUrl is required with driverClassName spring boot 2.0版本
    JpaRepository接口找不到 spring boot 项目
    解决IntelliJ “Initialization failed for 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/zifeiyu/p/3158327.html
Copyright © 2011-2022 走看看