いくつかのHtmlEncodeの違い


質問:
HttpUtility.HtmlDecode ,HttpUtility.HtmlEncodeとServerHtmlDecode ,Server.HtmlEncodeとHttpServerUtility.HtmlDecode , HttpServerUtility.HtmlEncodeの違いは何ですか?
彼らは以下の一般的な手書きのコードと何が違いますか?
public static string htmlencode(string str)  
 { 
        if (str == null || str == "") 
            return ""; 
        str = str.Replace(">", ">"); 
        str = str.Replace(" <", "<"); 
        str = str.Replace(" ", " "); 
        str = str.Replace("  ", "  "); 
        str = str.Replace("/"", """); 
        str = str.Replace("/'", "'"); 
        str = str.Replace("/n", " 
"); return str; }

答え:
HtmlEncode:Htmlソースファイルに表示されない文字を符号化します.通常、以下の文字「<」、「>」、「&」などを符号化します.
HtmlDecode:ちょうどHtmlEncodeに関連して、元の文字を復号します.
 
HttpServerUtilityエンティティークラスのHtmlEncodeメソッドは、実行時にASPからNET WebアプリケーションはSystemにアクセスする.Web.HttpUtility.HtmlEncodeメソッド.HttpServerUtilityエンティティクラスのHtmlEncodeメソッドは内部でSystemを使用する.Web.HttpUtility.HtmlEncodeは文字列を符号化する.
Server.HtmlEncodeはシステムですWeb.UI.PageクラスパッケージのHttpServerUtilityエンティティクラスのHtmlEncodeメソッド;System.Web.UI.Pageクラスには、public HttpServerUtility Server{get;}という属性があります.
 
サーバと考えられますHtmlDecode=HttpServerUtilityエンティティークラスのHtmlDecodeメソッド=HttpUtility.HtmlDecode ; Server.HtmlEncode=HttpServerUtilityエンティティクラスのHtmlEncodeメソッド=HttpUtility.HtmlEncode  ;
彼らは呼び出しの便利さのためにパッケージを作ったにすぎない.
 
 
ASPで、Server.HTML Encode Methodフィルタの文字は次のように記述されています.
文字列がDBCS符号化でない場合.このメソッドでは、次の文字が変換されます.
less-than character (<)
<
greater-than character (>)
>
ampersand character (&)
&
double-quote character (")
"
Any ASCII code character whose code is greater-than or equal to 0x80
&# , where 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 &# , where 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("<"); //             <
        TestChar(">"); //             >
        TestChar("'"); //             '
        TestChar(" "); //               
        TestChar(" "); //               
        TestChar("&"); // &         &
        TestChar("/""); //               "
        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("
    "); }

    そこで、上記の一般的な置き換え方法は非常に役に立ちます.彼はいくつかのHttpUtilityを処理しました.HtmlEncodeでサポートされていない置換.
    public static string htmlencode(string str)
    {
        if (str == null || str == "")
            return "";
        str = str.Replace(">", ">");
        str = str.Replace(" <", "<");
        str = str.Replace(" ", " ");       // HttpUtility.HtmlEncode(         
        str = str.Replace("  ", "  ");     // HttpUtility.HtmlEncode(         
        str = str.Replace("/"", """);
        str = str.Replace("/'", "'");
        str = str.Replace("/n", " 
    "); // HttpUtility.HtmlEncode( return str; }

    Reflectorを使用してHttpUtilityを確認します.HtmlEncodeの実装では、5つの状況しか考慮されていません.スペース、リターンは処理されていません.
    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("&");
                                    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);
                        }
                    }
                }
            }
        }
    } 

     
     
    参考資料:
    HttpUtility.HtmlDecodeとServerHtmlDecodeの違いhttp://topic.csdn.net/u/20090220/11/110c8079-1632-418a-b43b-3ddb2f0a06e2.html
    いくつかのWebサイトを構築する際によく使われる符号化方法を詳しく説明します.http://blog.miniasp.com/?tag=/htmlencode
    Silverlight用NET Frameworkクラスライブラリ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