(转)几种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. str.Replace("<", "<");
  6. str.Replace(">", ">");
  7. str.Replace(" ", " ");
  8. str.Replace(" ", "  ");
  9. str.Replace("/"", """);
  10. str.Replace("/‘", "‘");
  11. str.Replace("/n", "<br/>");
  12. return str;
  13. }

答案:

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.     例外字符:! * ( ) ‘  
时间: 2024-11-05 21:38:57

(转)几种HtmlEncode的区别的相关文章

几种HtmlEncode的区别(转)

一.C#中的编码 HttpUtility.HtmlDecode.HttpUtility.HtmlEncode与Server.HtmlDecode.Server.HtmlEncode与HttpServerUtility.HtmlDecode.HttpServerUtility.HtmlEncode的区别? 它们与下面一般手工写的代码有什么区别? public static string htmlencode(string str) { if (str == null || str == "&quo

几种 HtmlEncode 的区别(转发)

问题: HttpUtility.HtmlDecode ,HttpUtility.HtmlEncode  与  Server.HtmlDecode ,Server.HtmlEncode  与 HttpServerUtility.HtmlDecode , HttpServerUtility.HtmlEncode 有什么区别? 他们与下面一般手工写的代码有什么不一样的? public static string htmlencode(string str) { if (str == null || s

虚拟机NetworkAdapter三种方式的区别

虚拟机在安装时默认的有三块网卡,VMnet1和VMnet8,另外还有VMnet0 Vmware 还提供了三种网络连接模式: 分别为: A 桥接bridge  B NAT 网络地址转换 C  主机模式 下面来简单说一下 三种方式的区别  : 1) bridge : 默认使用VMnet0,不提供DHCP服务 在桥接模式下,虚拟机和宿主计算机处于同等地位,虚拟机就像是一台真实主机一样存在于局域网中.因此在桥接模式下,我们就要像对待其他真实计算机一样为其配置IP.网关.子网掩码等等.当我们可以自由分配局

UIImage两种初始化的区别

UIImage可以通过以下两种方式进行初始化: 1 //第一种初始化方式:[注意使用这种初始化的时候如果是png格式的可以不给后缀名,根据屏幕的的分辨率去匹配图片] 2 UIImage *image = [UIImage imageNamed:@"v_red_heart_selected"]; 1 //第二种初始化方式:[必须拼接图片的全名称,否则image的路径为空] 2 NSString *filePath = [[NSBundle mainBundle] pathForResou

PHP中数组合并的两种方法及区别介绍

PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = array( 'where' => 'uid=2', 'order' => 'uid desc', ); 1. array_merge,如果两个数组存在相同的key,后面的一个会覆盖前面的 复制代码代码如下: <?php $c = array_merge($a, $b); var_expo

.NET中的三种Timer的区别和用法(转)

最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是:  //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用.  System.Windows.Forms.Timer  // 2.提供以指定的时间间隔执行方法的机制.无法继承此类.  System.Threading.Timer  //3.在应用程序中生成定期事件.  System.Timers.Timer  这三个定时器位

UIimage两种初始化的区别 广告轮播封装

UIimage两种初始化的区别 第一种初始化: UIImage *image = [UIImage imageNamed:@"xxx"];  注意(这种方法加载的图片如果后缀名是png的,可以不写后缀名,根据屏幕分辨率自己去匹配图片) 第二种初始化: NSString *path = [[NSBundle mainBundle] pathForResource:@"xxx.png" ofType:nil]; UIImage *image = [[UIImage al

Activity的四种启动模式区别

(1) standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中. (2) singleTop 如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例. (3)singleTask 如果在栈中已经有该Activity的实例,就重用该实例.重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈.如果栈中不存在该实例,将会创建新的实例放入栈中. (

定义c/c++全局变量/常量几种方法的区别(转载)

出自:http://www.cnblogs.com/yaozhongxiao/archive/2010/08/08/1795338.html 在讨论全局变量之前我们先要明白几个基本的概念:  1. 编译单元(模块): 在ide开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误 (link error)  因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用 gcc,makefile等工具在linux或者嵌入