几种HtmlEncode的区别(转CSDN)
2018-09-14  0次浏览

一、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对象中返回已解码的字符串

    例外字符:! * ( ) '

---------------------------------

文章摘自:https://blog.csdn.net/wd330260402/article/details/5977989

建站&运营更多 >
蓝海博客更多 >
同城哪里
俱乐部落
手机版

本站部分图片和内容来源于网络,版权归原作者或原公司所有,如果您认为我们侵犯了您的版权请告知我们将立即删除

© Copyright 2017. 5UEC.com . 鲁ICP备17002755号-1   公安机关备案号:37100202000473