System.Web.HttpUtility.HtmlEncode / Decode的替代品?

时间:2010-05-06 08:28:16

标签: .net entities html-entities

.net 3.5(sp1)中的System.Web.HttpUtility.HtmlEncode / .Decode函数是否有“更薄”的替代品?一个单独的库是好的......甚至是“想要的”,至少是一些不会引入System.Web所需依赖的“全新世界”的东西。

我只想将普通字符串转换为符合xml / xhtml标准的字符串(& back)。

6 个答案:

答案 0 :(得分:26)

在.NET Framework 4.0中,也许是System.Net.WebUtility.HtmlEncode请注意,此类位于System.dll而不是System.Web.dll

答案 1 :(得分: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;", "&");
}

答案 2 :(得分: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();
}

实施的结果:

对字符串执行大量的Replace()会非常有用,尤其是在大字符串上。

<强>声明:

此解决方案的灵感来自于在.NET Framework 4.0系统程序集上使用JetBrains dotPeek

答案 3 :(得分:1)

如果可能,您可以从Mono代码中“借用”HttpUtility类,并直接将其编译为您的实用程序集。

答案 4 :(得分:1)

虽然编码看似简单,但我强烈建议使用广泛使用的库,以最大限度地降低安全漏洞的风险。 Microsoft的Anti-Cross Site Scripting Library提供了Html / Xml / Javascript转义的方法以及相应的属性转义,并且应该涵盖您的大部分Web需求。

答案 5 :(得分:0)

与@marco相同,除了语言是powershell

function Invoke-HTMLEncode
{ #https://stackoverflow.com/questions/2779594/alternative-to-system-web-httputility-htmlencode-decode

  param($string)
  if([string]::isNullorEmpty($string))
  { 
   $return = $null
  }
  $result = [system.text.stringbuilder]::new($string.length)
  foreach($ch in $string.ToCharArray()) 
  {
    if([byte][char]$ch -le [byte][char]'>')
    {
     switch ($ch)
     {
       '<' {
         $result.append("&lt;") | out-null
         break;
       }
       '>' {
        $result.append("&gt;")| out-null
        break;
      }
      '"' {
        $result.append("&quot;")| out-null
        break;
      }
      '&'{
        $result.append("&amp;")| out-null
        break;
      }
      default {
        $result.append($ch)| out-null
        break;
      }
     } 
    }
    elseif([byte][char]$ch -ge 160 -and [byte][char]$ch -lt 256)
    {
      #result.Append("&#").Append(((int)ch).ToString(CultureInfo.InvariantCulture)).Append(';');
      $result.append("&#").append(([byte][char]$ch).toString([System.Globalization.CultureInfo]::InvariantCulture)).append(';') | out-null
    }
    else
    {
      $result.Append($ch) | out-null
    }
  }
  $result.ToString()
}