.net 3.5(sp1)のSystem.Web.HttpUtility.HtmlEncode / .Decode関数に代わる「slimmer」関数はありますか?別のライブラリで問題ありません。少なくとも、System.Webが必要とする依存関係の「まったく新しい世界」を引き込まないものは「必要」です。
通常の文字列をxml/xhtml準拠の同等の文字列(&back)に変換したいだけです。
.net 3.5(sp1)のSystem.Web.HttpUtility.HtmlEncode / .Decode関数に代わる「slimmer」関数はありますか?別のライブラリで問題ありません。少なくとも、System.Webが必要とする依存関係の「まったく新しい世界」を引き込まないものは「必要」です。
通常の文字列をxml/xhtml準拠の同等の文字列(&back)に変換したいだけです。
.NET Framework 4.0では、System.Net.WebUtility.HtmlEncodeはおそらく?このクラスはSystem.Web.dllではなくSystem.dllにあることに注意してください。
XMLの場合、特別な意味を持つ文字をエンコードするだけでよいので、次のような単純なもので済ますことができます。
public static string XmlEncode(string value) {
return value
.Replace("<", "<")
.Replace(">", ">")
.Replace("\"", """)
.Replace("'", "'")
.Replace("&", "&");
}
public static string XmlDecode(string value) {
return value
.Replace("<", "<")
.Replace(">", ">")
.Replace(""", "\"")
.Replace("'", "'")
.Replace("&", "&");
}
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("<");
break;
case '>':
result.Append(">");
break;
case '"':
result.Append(""");
break;
case '\'':
result.Append("'");
break;
case '&':
result.Append("&");
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を使用することから着想を得ました。
エンコーディングは単純に見えるかもしれませんが、セキュリティの脆弱性のリスクを最小限に抑えるために、広く使用されているライブラリを使用することを強くお勧めします。MicrosoftのAnti-CrossSiteScripting Libraryは、Html / Xml / Javascriptをエスケープするためのメソッドを提供し、それぞれの属性をエスケープして、Webのニーズのほとんどをカバーする必要があります。
可能であれば、MonoコードからHttpUtilityクラスを「借用」して、ユーティリティアセンブリに直接コンパイルできます。
言語が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("<") | out-null
break;
}
'>' {
$result.append(">")| out-null
break;
}
'"' {
$result.append(""")| out-null
break;
}
'&'{
$result.append("&")| 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()
}