(转)几种HtmlEncode的区别
一、C#中的编码
HttpUtility.HtmlDecode、HttpUtility.HtmlEncode与Server.HtmlDecode、Server.HtmlEncode与HttpServerUtility.HtmlDecode、HttpServerUtility.HtmlEncode的区别?
它们与下面一般手工写的代码有什么区别?
- public static string htmlencode(string str)
- {
- if (str == null || str == "")
- return "";
- str.Replace("<", "<");
- str.Replace(">", ">");
- str.Replace(" ", " ");
- str.Replace(" ", " ");
- str.Replace("/"", """);
- str.Replace("/'", "'");
- str.Replace("/n", "<br/>");
- return str;
- }
答案:
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;
它们只不过是为了调用方便,进行了封装而已;
下面是一个非常简单的替换测试代码,测试结果看注释:
- protected void Page_Load(object sender, EventArgs e)
- {
- TestChar("<"); //小于号 替换为 <
- TestChar(">"); //大于号 替换为 >
- TestChar(" "); //英文半角空格 替换为 不做替换;
- TestChar(" "); //中文全角空格 替换为 不做替换;
- TestChar("&"); //& 替换为 &
- TestChar("/'"); //单引号 替换为 ';
- TestChar("/""); //双引号 替换为 "
- TestChar("/r"); //回车 替换为 不做替换;
- TestChar("/n"); //回车 替换为 不做替换;
- TestChar("/r/n"); //回车 替换为 不做替换;
- }
- protected void TestChar(String str)
- {
- Response.Write(Server.HtmlEncode(str));
- Response.Write("----------------------");
- Response.Write(HttpUility.HtmlEncode(str));
- Response.Write("<br/>");
- }
所以手工的替换方法还是很有必要的,处理一些HtmlEncode不支持的替换。
- public static string htmlencode(string str)
- {
- str.Replace("<", "<");
- str.Replace(">", ">");
- str.Replace(" ", " ");
- str.Replace(" ", " ");
- str.Replace("/'", "'");
- str.Replace("/"", """);
- str.Replace("/n", "<br/>");
- }
使用Reflector 查看 HttpUttility.HtmlEncode 的实现,我们就可以看到,它只考虑的五种情况,空格,回车是没有处理的:
- public static unsafe void HtmlEncode(string value, TextWriter output)
- {
- if (value != null)
- {
- if (output == null)
- {
- throw new ArgumentNullException("output");
- }
- int num = IndexOfHtmlEncodingChars(value, 0);
- if (num == -1)
- {
- output.Write(value);
- }
- else
- {
- int num2 = value.Length - num;
- fixed (char* str = ((char*) value))
- {
- char* chPtr = str;
- char* chPtr2 = chPtr;
- while (num-- > 0)
- {
- chPtr2++;
- output.Write(chPtr2[0]);
- }
- while (num2-- > 0)
- {
- chPtr2++;
- char ch = chPtr2[0];
- if (ch <= '>')
- {
- switch (ch)
- {
- case '&':
- {
- output.Write("&");
- continue;
- }
- case '/'':
- {
- output.Write("'");
- continue;
- }
- case '"':
- {
- output.Write(""");
- continue;
- }
- case '<':
- {
- output.Write("<");
- continue;
- }
- case '>':
- {
- output.Write(">");
- continue;
- }
- }
- output.Write(ch);
- continue;
- }
- if ((ch >= '/x00a0') && (ch < 'ā'))
- {
- output.Write("&#");
- output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));
- output.Write(';');
- }
- else
- {
- output.Write(ch);
- }
- }
- }
- }
- }
- }
二、JS中的编码和解码
- 一、escape/unescape
- escape:escape 方法返回一个包含 charstring 内容的字符串值(Unicode 格式)。所有空格、标点、 重音符号以及任何其他非 ASCII 字符都用 %xx 编码替换,其中 xx 等于表示该字符的十六进制数
- unescape:从用 escape 方法编码的 String 对象中返回已解码的字符串
- 例外字符: @ * / +
- 二、encodeURI/decodeURI
- encodeURI:方法返回一个已编码的 URI。如果将编码结果传递给 decodeURI,则将返回初始的字符串。encodeURI 不对下列字符进行编码:“:”、“/”、“;”和“?”。请使用 encodeURIComponent 对这些字符进行编码
- decodeURI:从用encodeURI方法编码的String对象中返回已解码的字符串
- 例外字符:! @ # $ & * ( ) = : / ; ? + '
- 三、encodeURIComponent/decodeURIComponent
- encodeURIComponent:encodeURIComponent 方法返回一个已编码的 URI。如果将编码结果传递给decodeURIComponent,则将返回初始的字符串。因为 encodeURIComponent 方法将对所有字符编码
- decodeURIComponent:从用encodeURIComponent方法编码的String对象中返回已解码的字符串
- 例外字符:! * ( ) '
(转)几种HtmlEncode的区别的更多相关文章
- 几种HtmlEncode的区别(转)
一.C#中的编码 HttpUtility.HtmlDecode.HttpUtility.HtmlEncode与Server.HtmlDecode.Server.HtmlEncode与HttpServe ...
- 几种 HtmlEncode 的区别(转发)
问题: HttpUtility.HtmlDecode ,HttpUtility.HtmlEncode 与 Server.HtmlDecode ,Server.HtmlEncode 与 HttpS ...
- Java中serialVersionUID的解释及两种生成方式的区别(转载)
转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用: 序列化时为了保持版 ...
- 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别
链接属性rel='external'.rel='nofollow'.rel='external nofollow'三种写法的区别 大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎, ...
- jsp中两种include的区别【转】
引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...
- UIImage两种初始化的区别
UIImage可以通过以下两种方式进行初始化: //第一种初始化方式:[注意使用这种初始化的时候如果是png格式的可以不给后缀名,根据屏幕的的分辨率去匹配图片] UIImage *image = [U ...
- Linux 下Shell 脚本几种基本命令替换区别
Shell 脚本几种基本命令替换区别 前言:因为工作需要,需要编写 shell script .编写大量 shell script 时,累计了大量经验,也让自己开始迷糊几种函数输出调用的区别.后面和 ...
- PHP中数组合并的两种方法及区别介绍
PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...
- 执行shell脚本的几种方法及区别
执行shell脚本的几种方法及区别 http://blog.csdn.net/lanxinju/article/details/6032368 (认真看) 注意:如果涉及到脚本之间的调用一定要用 . ...
随机推荐
- 武汉科技大学ACM:1005: 单位转换
Problem Description BobLee最近在复习考研,在复习计算 机组成原理的时候,遇到了一个问题.就是在计算机存储里面的单位转换.我们都知道1MB=1024KB,1KB=1024B,1 ...
- MAC OSX10.9.2上搭建Apache,php
mac osx10.9.* 自带了apache, php Apache配置 1- 启动 sudo apachectl start 启动后,访问 http://localhost/ 应该能看到" ...
- ubuntu 12.04 安装nginx
nginx是一个强大的高性能反向代理服务器,其特点是占内存少,并发能力强,在高并发的情况下是apache 的一个不错的代替品,能够支持高达50000个并发连接数的响应,那么这么强大的武器,究竟如何在l ...
- opencv中Mat类型数据操作与遍历
Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是 ...
- Speed-BI报表按钮链接设置
使用Speed-BI开发报表的时候,常常会需要增加一个链接按钮,点击按钮可跳转到其他报表或外部链接:那么我们可以通过新增‘仪表盘’--‘文本框’图表(如图1), <ignore_js_op> ...
- 【转】【教程】office 2013 & visio 2013的激活
原文网址:http://zhan.renren.com/sola86?gid=3602888498037097351&checked=true 1.下载安装文件 office和visio都有两 ...
- android仿京东、淘宝商品详情页上拉查看详情
话不多说,直接上干货,基本就是一个scrollview中嵌套两个scrollview或者webview;关键点事处理好子scrollview和父scrollview的触摸.滑动事件已达到想要的效果.大 ...
- Android视频录制
public class MainActivity extends Activity { private MediaRecorder videoRecorder=null; private Butto ...
- hdu-3790最短路径问题
Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Inp ...
- POJ-1488(字符串应用)
Description TEX is a typesetting language developed by Donald Knuth. It takes source text together w ...