Альтернатива System.Web.HttpUtility.HtmlEncode / Decode? - PullRequest
4 голосов
/ 06 мая 2010

Есть ли в .net 3.5 (sp1) какая-либо более «тонкая» альтернатива функциям System.Web.HttpUtility.HtmlEncode / .Decode? Отдельная библиотека - это хорошо ... или даже "желательно", по крайней мере, то, что не тянет в "совершенно новый мир" зависимостей, которые требуются System.Web.

Я хочу преобразовать только нормальную строку в ее эквивалент XML / XHTML (& обратно).

Ответы [ 6 ]

26 голосов
/ 06 мая 2010

В .NET Framework 4.0, System.Net.WebUtility.HtmlEncode возможно? Обратите внимание, что этот класс находится в System.dll, а не в System.Web.dll .

5 голосов
/ 06 мая 2010

Для 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;", "&");
}
4 голосов
/ 19 сентября 2013

Для 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 () для строки было бы очень неэффективно, особенно для больших строк.

Отказ от ответственности:

Это решение было вдохновлено использованием JetBrains dotPeek в сборке системы .NET Framework 4.0.

1 голос
/ 06 мая 2010

Хотя кодирование может показаться простым, я настоятельно рекомендую использовать широко распространенную библиотеку, чтобы минимизировать риск уязвимостей безопасности. * * * * * * * * * * * * * * * * * * * * * * * * *. * * * * * * * * * * * *.

1 голос
/ 06 мая 2010

Если возможно, вы можете «позаимствовать» класс HttpUtility из кода Mono и скомпилировать его непосредственно в сборку вашей утилиты.

0 голосов
/ 25 мая 2018

то же самое, что и @marco, за исключением того, что язык - powershell

function Invoke-HTMLEncode
{ #/2122949/alternativa-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()
}
...