一、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. oracle过滤名字中含有_的行

    select * from emp where ename like '%\_%' escape '\'; escape 定义转义字符串,这样转义字符串后的字符就是普通字符.

  2. java——JNI(例子控制台(64位)清屏

    因为java的最底层是jvm,所以单纯的控制台java程序不能感知jvm再下面的操作系统的情况, 可以通过JNI(Java Native Interface)技术实现java后台调用C++/C的dll ...

  3. 外国高手画神级的linux 内核图,够详细!

  4. C#中串口与Modem的通信

    C#中串口与Modem的通信 2007-08-20 09:52643人阅读评论(8)收藏举报 最近一段时间,试验了串口的数据传输.在C#中,其实有一个很好的类SerialPort使串口间的通信变得简单 ...

  5. MemCached高级缓存

    MemCached高级缓存配置 Memcache相关介绍: memcache 是一个高性能的分布式的内存对象缓存系统,它能够存储各种各样的的数据,包括图片,视频,文件等等.缓存功能. DB.数据源-- ...

  6. ionic框架,快速开发webAPP神器。

    官网地址 http://www.ionicframework.com/ 这个国外框架已经很火了.会使用插件的话更好,例如支付宝支付插件,调用摄像头拍照,二维码扫描,通讯录,文件上传,推送信息等等. 最 ...

  7. Android Framework------之ActivityManagerService与Activity之间的通信

    研究Android系统的童鞋,想必都已经了解一个Activity的启动过程了.而且在网上,关于Activity的启动的文章非常多,很容易就能找到的.这篇文章的重点放在ActivityManagerSe ...

  8. 自己动手开发编译器(五)miniSharp语言的词法分析器

    稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数.这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式.而标识符的正则表达式有4万多个字 ...

  9. salt-grains

    自定义grains 的方法 1: 在minion 的配置文件夹 /etc/salt/minion.d  下面包含的配置文件  grains.conf 2: 在salt的安装目录中建立grains 文件 ...

  10. C语言学习笔记--指针与字符串

    字符类型 char(character)是一种整数,也是一种特殊的类型:字符.这是因为 ① 用单引号表示的字符字符字面量:‘a’,'1' ②‘’也是一个字符 ③printf和scanf里用%c来输入. ...