¿Cómo puedo decodificar caracteres HTML en C #?

397

Tengo direcciones de correo electrónico codificadas con entidades de caracteres HTML. ¿Hay algo en .NET que pueda convertirlos en cadenas simples?

Vasil
fuente

Respuestas:

618

Puedes usar HttpUtility.HtmlDecode

Si está utilizando .NET 4.0+, también puede usarlo, WebUtility.HtmlDecodeque no requiere una referencia de ensamblaje adicional, ya que está disponible en el System.Netespacio de nombres.

Quintin Robinson
fuente
1
Se supone que está en System.Web, pero no lo está. No he tocado C # durante más de un año, si me siento un poco más frustrado con esto, los convertiré manualmente.
Vasil
1
Está en la versión .NET 2.0 de System.Web
Mark Cidade el
1
Tengo usando System.Web. En mi contexto, ese espacio de nombres solo tiene algunas clases AspPermission.
Vasil
17
Agregue una referencia a System.Web.Dll en las propiedades de su proyecto. Las clases que ve en vivo en System.dll, a las que se hace referencia de forma predeterminada.
OwenP
11
En caso de que intente decodificar la Cadena de consulta, debe usarHttpUtility.UrlDecode
PeterX
189

En .Net 4.0:

System.Net.WebUtility.HtmlDecode()

No es necesario incluir el ensamblaje para un proyecto de C #

Indy9000
fuente
66
Es una mejor solución porque HttpUtility no decodifica "& apos;" símbolo .. No sé por qué ..
RredCat
Esto es necesario en el desarrollo de la plataforma universal de Windows.
matthewsheets
¿Causará esto XSS en las páginas web .Net?
Senura Dissanayake
43

Como dice @CQ, debe usar HttpUtility.HtmlDecode , pero no está disponible en un proyecto que no sea ASP .NET de forma predeterminada.

Para una aplicación que no sea ASP .NET, debe agregar una referencia a System.Web.dll. Haga clic derecho en su proyecto en el Explorador de soluciones, seleccione "Agregar referencia", luego busque la lista System.Web.dll.

Ahora que se agrega la referencia, debería poder acceder al método utilizando el nombre completo System.Web.HttpUtility.HtmlDecodeo insertar una usingdeclaración para System.Webfacilitar las cosas.

OwenP
fuente
16

Si no hay contexto de servidor (es decir, se está ejecutando sin conexión), puede usar HttpUtility . HtmlDecode .

Rob Cooper
fuente
1
De acuerdo, por eso uso HttpUtility, caí en la misma trampa = P
Quintin Robinson el
7

Use Server.HtmlDecodepara decodificar las entidades HTML. Si desea escapar del HTML, es decir, mostrar el carácter <y >al usuario, use Server.HtmlEncode.

Daniel Schierbeck
fuente
44
Puede que no haya un contexto de servidor (es decir, al ejecutar casos de prueba y similares) caí en esta trampa antes :)
Rob Cooper
7

Para decodificar HTML, eche un vistazo debajo del código

string s = "Svendborg V&#230;rft A/S";
string a = HttpUtility.HtmlDecode(s);
Response.Write(a);

La salida es como

 Svendborg Værft A/S
Abhishek Jaiswal
fuente
2
El 'ToString ()' es redundante ya que HtmlDecode devuelve una cadena
Justin
6

También vale la pena mencionar que si está utilizando HtmlAgilityPack como yo, debería usarlo HtmlAgilityPack.HtmlEntity.DeEntitize(). Toma a stringy devuelve a string.

Hypershadsy
fuente
1

Escriba un método estático en alguna clase de utilidad, que acepte la cadena como parámetro y devuelva la cadena html decodificada.

Incluye el using System.Web.HttpUtilityen tu clase

public static string HtmlEncode(string text)
    {
        if(text.length > 0){

           return HttpUtility.HtmlDecode(text);
        }else{

         return text;
        }

    }
Tahir Alvi
fuente
1

Para .net 4.0

Agregue una referencia al System.net.dllproyecto con using System.Net;luego use las siguientes extensiones

// Html encode/decode
    public static string HtmDecode(this string htmlEncodedString)
    {
        if(htmlEncodedString.Length > 0)
        {
            return System.Net.WebUtility.HtmlDecode(htmlEncodedString);
        }
        else
        {
            return htmlEncodedString;
        }
    }

    public static string HtmEncode(this string htmlDecodedString)
    {
        if(htmlDecodedString.Length > 0)
        {
            return System.Net.WebUtility.HtmlEncode(htmlDecodedString);
        }
        else
        {
            return htmlDecodedString;
        }
    }
Vinod Srivastav
fuente
0

Para cadenas que contienen & # x20; He tenido que decodificar dos veces la cadena. La primera decodificación la convertiría en la segunda pasada la decodificaría correctamente al carácter esperado.

self.name
fuente