幾種 HtmlEncode 的區別(轉發)

問題:html

HttpUtility.HtmlDecode ,HttpUtility.HtmlEncode  與  Server.HtmlDecode ,Server.HtmlEncode  與 HttpServerUtility.HtmlDecode , HttpServerUtility.HtmlEncode 有什麼區別?windows

他們與下面通常手工寫的代碼有什麼不同的?less

public static string htmlencode(string str)
 {
        if (str == null || str == "")
            return "";
        str = str.Replace(">", ">");
        str = str.Replace(" <", "&lt;");
        str = str.Replace(" ", "&nbsp;");
        str = str.Replace("  ", " &nbsp;");
        str = str.Replace("\"", "&quot;");
        str = str.Replace("\'", "'");
        str = str.Replace("\n", " <br/> ");
        return str;
}

答案:測試

HtmlEncode: 將 Html 源文件中不容許出現的字符進行編碼,一般是編碼如下字符"<"、">"、"&" 等。編碼

HtmlDecode: 恰好跟 HtmlEncode 相關,解碼出來本來的字符。spa

 

HttpServerUtility 實體類的 HtmlEncode 方法 是一種簡便方式,用於在運行時從 ASP.NET Web 應用程序訪問 System.Web.HttpUtility.HtmlEncode 方法。HttpServerUtility 實體類的 HtmlEncode 方法 在內部使用 System.Web.HttpUtility.HtmlEncode 對字符串進行編碼。.net

Server.HtmlEncode 其實就是 System.Web.UI.Page 類封裝的 HttpServerUtility 實體類的 HtmlEncode 方法; System.Web.UI.Page  類有這樣的一個屬性: public HttpServerUtility Server { get; }3d

 

因此咱們能夠認爲:

Server.HtmlDecode  =  HttpServerUtility 實體類的 HtmlDecode 方法  = HttpUtility.HtmlDecode ;code

Server.HtmlEncode  =  HttpServerUtility 實體類的 HtmlEncode 方法  = HttpUtility.HtmlEncode  ;orm

他們只不過是爲了調用方便,作了封裝而已。

 

 

在 ASP 中, Server.HTMLEncode Method 過濾的字符描述以下:

若是字符串不是 DBCS 編碼。這個方法將轉換下面字符:

less-than character (<) &lt;
greater-than character (>) &gt;
ampersand character (&) &amp;
double-quote character (") &quot;
Any ASCII code character whose code is greater-than or equal to 0x80 &#<number>, where <number> is the ASCII character value.

若是是 DBCS 編碼

  • All extended characters are converted.
  • Any ASCII code character whose code is greater-than or equal to 0x80 is converted to &#<number>, where <number> is the ASCII character value.
  • Half-width Katakana characters in the Japanese code page are not converted.

相關資料:

Server.HTMLEncode Method

http://msdn.microsoft.com/en-us/library/ms525347.aspx

 

在ASP.net 中狀況也相似

下面是一個簡單的替換測試代碼,測試結果看以後的註釋:

protected void Page_Load(object sender, EventArgs e)
{

    TestChar("<"); // 小於號    替換   &lt;
    TestChar(">"); // 大於號    替換   &gt;
    TestChar("'"); // 單引號    替換   '
    TestChar(" "); // 半角英文空格    不作替換
    TestChar(" "); // 全角中文空格    不作替換
    TestChar("&"); // &    替換   &amp;
    TestChar("\""); // 英文雙引號    替換   &quot;
    TestChar("\n"); // 回車    不作替換
    TestChar("\r"); // 回車    不作替換
    TestChar("\r\n"); // 回車    不作替換
}


public void TestChar(string t)
{
    Response.Write(Server.HtmlEncode(t));
    Response.Write("__");
    Response.Write(HttpUtility.HtmlEncode(t));
    Response.Write("<br />");
}

因此上面咱們提到的經常使用替換方式仍是很是有用的,他還處理了一些 HttpUtility.HtmlEncode 不支持的替換。

public static string htmlencode(string str)
{
    if (str == null || str == "")
        return "";
    str = str.Replace(">", "&gt;");
    str = str.Replace(" <", "&lt;");
    str = str.Replace(" ", "&nbsp;");       // HttpUtility.HtmlEncode( 並不支持這個替換
    str = str.Replace("  ", " &nbsp;");     // HttpUtility.HtmlEncode( 並不支持這個替換
    str = str.Replace("\"", "&quot;");
    str = str.Replace("\'", "'");
    str = str.Replace("\n", " <br/> ");     // HttpUtility.HtmlEncode( 並不支持這個替換
    return str;
}

咱們使用 Reflector 查看 HttpUtility.HtmlEncode 的實現,咱們就能夠看到,它只考慮的五種狀況,空格,回車是沒有處理的:

使用 Reflector 查看 HttpUtility.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("&amp;");
                                continue;
                            }
                            case '\'':
                            {
                                output.Write("'");
                                continue;
                            }
                            case '"':
                            {
                                output.Write("&quot;");
                                continue;
                            }
                            case '<':
                            {
                                output.Write("&lt;");
                                continue;
                            }
                            case '>':
                            {
                                output.Write("&gt;");
                                continue;
                            }
                        }
                        output.Write(ch);
                        continue;
                    }
                    if ((ch >= '\x00a0') && (ch < 'ā'))
                    {
                        output.Write("&#");
                        output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));
                        output.Write(';');
                    }
                    else
                    {
                        output.Write(ch);
                    }
                }
            }
        }
    }
} 

參考資料:

HttpUtility.HtmlDecode與Server.HtmlDecode區別

http://topic.csdn.net/u/20090220/11/110c8079-1632-418a-b43b-3ddb2f0a06e2.html

詳細解說幾個建置網站時經常使用的編碼方法

http://blog.miniasp.com/?tag=/htmlencode

用於 Silverlight 的 .NET Framework 類庫HttpUtility.HtmlEncode 方法

http://msdn.microsoft.com/zh-cn/library/system.windows.browser.httputility.htmlencode(VS.95).aspx

HttpUtility.HtmlEncode() and HttpServerUtility.HtmlEncode() do not encode all non-ASCII characters

https://connect.microsoft.com/VisualStudio/feedback/details/102251/httputility-htmlencode-and-httpserverutility-htmlencode-do-not-encode-all-non-ascii-characters?wa=wsignin1.0

轉自:http://blog.joycode.com/ghj/archives/2010/02/26/115894.joy

相關文章
相關標籤/搜索