2010-05-06 68 views
4

.net 3.5(sp1)中的System.Web.HttpUtility.HtmlEncode/.Decode函數有沒有「瘦」的選擇?一個單獨的庫很好..甚至是'想要的',至少是不會引入System.Web需要的依賴關係的'全新世界'的東西。替代System.Web.HttpUtility.HtmlEncode/Decode?

我只想要一個正常的字符串轉換成它的XML/XHTML兼容當量(&回)。

回答

5

對於XML,你只需要編碼有特殊含義的字符,所以你可以用喜歡簡單的東西脫身:

public static string XmlEncode(string value) { 
    return value 
    .Replace("<", "&lt;") 
    .Replace(">", "&gt;") 
    .Replace("\"", "&quot;") 
    .Replace("'", "&apos;") 
    .Replace("&", "&amp;"); 
} 

public static string XmlDecode(string value) { 
    return value 
    .Replace("&lt;", "<") 
    .Replace("&gt;", ">") 
    .Replace("&quot;", "\"") 
    .Replace("&apos;", "'") 
    .Replace("&amp;", "&"); 
} 
+0

我的問題實際上並不完全清楚,但那是我的用例。謝謝! – 2010-05-06 12:30:01

+2

這'XmlDecode'甚至沒有開始支付XML的字符和實體引用(http://www.w3.org/TR/xml/#sec-references),請不要介意'CDATA'節等 – 2010-10-28 12:03:06

1

如果可能的話,你可以從單碼「借用」 HttpUtility類直接編譯你的工具程序集。

1

雖然編碼可能看起來很簡單,我強烈建議使用一個庫,是在廣泛使用,以儘量減少安全漏洞的風險。微軟的Anti-Cross Site Scripting Library提供了Html/Xml/Javascript轉義的方法和相應的屬性轉義,並且應該覆蓋大部分Web需求。

22

在.NET Framework 4.0中,System.Net.WebUtility.HtmlEncode吧? 請注意,這個類位於System.dll中,而不是System.Web.dll

+0

好的。值得注意的是它只能在.net 4.0或更高版本中使用。 – dmihailescu 2015-01-09 15:14:24

4

對於HTML,如果使用.NET Framework 4.0的System.Net.WebUtility不是一個可行的解決方案,你可以這樣做:

string HtmlEncode(string s) 
{ 
    if (s == null) 
    { 
     return null; 
    } 

    var result = new StringBuilder(s.Length); 

    foreach (char ch in s) 
    { 
     if (ch <= '>') 
     { 
      switch (ch) 
      { 
       case '<': 
        result.Append("&lt;"); 
        break; 

       case '>': 
        result.Append("&gt;"); 
        break; 

       case '"': 
        result.Append("&quot;"); 
        break; 

       case '\'': 
        result.Append("&#39;"); 
        break; 

       case '&': 
        result.Append("&amp;"); 
        break; 

       default: 
        result.Append(ch); 
        break; 
      } 
     } 
     else if (ch >= 160 && ch < 256) 
     { 
      result.Append("&#").Append(((int)ch).ToString(CultureInfo.InvariantCulture)).Append(';'); 
     } 
     else 
     { 
      result.Append(ch); 
     } 
    } 

    return result.ToString(); 
} 

實施立信:

做了很多替換的()在一個字符串上會非常不方便,特別是在大字符串上。

免責聲明:

該解決方案是由在.NET Framework 4.0系統組件使用JetBrains dotPeek啓發。

+0

+1不知道System.Net.WebUtility! – BrunoSalvino 2014-01-20 18:05:33