問題: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(" <", "<"); str = str.Replace(" ", " "); str = str.Replace(" ", " "); str = str.Replace("\"", """); 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 (<) | < |
greater-than character (>) | > |
ampersand character (&) | & |
double-quote character (") | " |
Any ASCII code character whose code is greater-than or equal to 0x80 | &#<number>, where <number> is the ASCII character value. |
若是是 DBCS 編碼
相關資料:
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("<br />"); }
因此上面咱們提到的經常使用替換方式仍是很是有用的,他還處理了一些 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", " <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("&"); 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與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