一、C#中的编码

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

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

  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;

它们只不过是为了调用方便,进行了封装而已;

下面是一个非常简单的替换测试代码,测试结果看注释:

  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不支持的替换。

  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 的实现,我们就可以看到,它只考虑的五种情况,空格,回车是没有处理的:

  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中的编码和解码

  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.     例外字符:! * ( ) '  

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

  1. 几种HtmlEncode的区别(转)

    一.C#中的编码 HttpUtility.HtmlDecode.HttpUtility.HtmlEncode与Server.HtmlDecode.Server.HtmlEncode与HttpServe ...

  2. 几种 HtmlEncode 的区别(转发)

    问题: HttpUtility.HtmlDecode ,HttpUtility.HtmlEncode  与  Server.HtmlDecode ,Server.HtmlEncode  与 HttpS ...

  3. Java中serialVersionUID的解释及两种生成方式的区别(转载)

    转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用:        序列化时为了保持版 ...

  4. 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别

    链接属性rel='external'.rel='nofollow'.rel='external nofollow'三种写法的区别   大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎, ...

  5. jsp中两种include的区别【转】

    引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

  6. UIImage两种初始化的区别

    UIImage可以通过以下两种方式进行初始化: //第一种初始化方式:[注意使用这种初始化的时候如果是png格式的可以不给后缀名,根据屏幕的的分辨率去匹配图片] UIImage *image = [U ...

  7. Linux 下Shell 脚本几种基本命令替换区别

    Shell 脚本几种基本命令替换区别 前言:因为工作需要,需要编写 shell script .编写大量 shell script 时,累计了大量经验,也让自己开始迷糊几种函数输出调用的区别.后面和 ...

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

    PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...

  9. 执行shell脚本的几种方法及区别

    执行shell脚本的几种方法及区别 http://blog.csdn.net/lanxinju/article/details/6032368 (认真看) 注意:如果涉及到脚本之间的调用一定要用 . ...

随机推荐

  1. 如果设置http.get超时控制

    var timeout_wrapper = function (req) { return function () { // do some logging, cleaning, etc. depen ...

  2. php.ini的中文解释

    [PHP]  ; PHP还是一个不断发展的工具,其功能还在不断地删减  ; 而php.ini的设置更改可以反映出相当的变化,  ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;; ...

  3. ural 1294 Mars Satellites

    #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> u ...

  4. Android中的ContentValues用法

    ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而 ...

  5. LED驅動電路概述

    LED是一種固體光源,當它兩端加上正向電壓,半導體中的少數載流子和多數載流子發生復合,放出的過剩能量將引起光子發射.采用不同的材料,可制成不同顏色有 發光二極管 . 隨著對LED研究的進一步深入,其光 ...

  6. 在QT程序中使用cout和cin

    1先输入10个数字,再输出. #include <QtCore/QCoreApplication> #include <QtCore/QList> #include <Q ...

  7. 一道面试题与Java位操作 和 BitSet 库的使用

    前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...

  8. guestmount

    guestmountFor some types of changes, you may find it easier to mount the image's file system directl ...

  9. 【转】Windows下使用VS2008编译OpenCV 2.1 添加Intel TBB和Python支持

    Windows下使用VS2008编译OpenCV2.1 添加Intel TBB和Python支持 步骤: 1.仔细阅读OpenCV官网上的InstallGuide:http://opencv.will ...

  10. C语言 · 数字三角形 · 算法训练

    问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ...