4

.net 3.5(sp1)のSystem.Web.HttpUtility.HtmlEncode / .Decode関数に代わる「slimmer」関数はありますか?別のライブラリで問題ありません。少なくとも、System.Webが必要とする依存関係の「まったく新しい世界」を引き込まないものは「必要」です。

通常の文字列をxml/xhtml準拠の同等の文字列(&back)に変換したいだけです。

4

6 に答える 6

26

.NET Framework 4.0では、System.Net.WebUtility.HtmlEncodeはおそらく?このクラスはSystem.Web.dllではなくSystem.dllにあることに注意してください

于 2010-05-06T09:34:19.413 に答える
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;", "&");
}
于 2010-05-06T08:34:17.423 に答える
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()を実行すると、特に大きな文字列では非常に非効率になります。

免責事項:

このソリューションは、 .NETFramework4.0システムアセンブリでJetBrainsdotPeekを使用することから着想を得ました。

于 2013-09-18T22:40:36.100 に答える
1

エンコーディングは単純に見えるかもしれませんが、セキュリティの脆弱性のリスクを最小限に抑えるために、広く使用されているライブラリを使用することを強くお勧めします。MicrosoftのAnti-CrossSiteScripting Libraryは、Html / Xml / Javascriptをエスケープするためのメソッドを提供し、それぞれの属性をエスケープして、Webのニーズのほとんどをカバーする必要があります。

于 2010-05-06T08:43:14.080 に答える
1

可能であれば、MonoコードからHttpUtilityクラスを「借用」して、ユーティリティアセンブリに直接コンパイルできます。

于 2010-05-06T08:35:56.230 に答える
0

言語がPowerShellであることを除いて、@marcoと同じです

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()
}
于 2018-05-25T03:04:42.587 に答える