Comment décoder des caractères HTML en C #?


397

J'ai des adresses e-mail encodées avec des entités de caractères HTML. Y a-t-il quelque chose dans .NET qui peut les convertir en chaînes simples?

Réponses:


618

Vous pouvez utiliser HttpUtility.HtmlDecode

Si vous utilisez .NET 4.0+, vous pouvez également utiliser WebUtility.HtmlDecodece qui ne nécessite pas de référence d'assembly supplémentaire car il est disponible dans l' System.Netespace de noms.


1
Il est censé être dans System.Web, mais ce n'est pas le cas. Je n'ai pas touché C # depuis plus d'un an, si je suis un peu plus frustré, je les convertirai manuellement.
Vasil

1
Il est dans la version .NET 2.0 de System.Web
Mark Cidade

1
J'utilise System.Web. Dans mon contexte, cet espace de noms n'a que quelques classes AspPermission.
Vasil

17
Ajoutez une référence à System.Web.Dll dans les propriétés de votre projet. Les classes que vous voyez vivent dans System.dll qui est référencé par défaut.
OwenP

11
Si vous essayez de décoder la chaîne de requête, vous devez utiliserHttpUtility.UrlDecode
PeterX

189

Sur .Net 4.0:

System.Net.WebUtility.HtmlDecode()

Pas besoin d'inclure l'assemblage pour un projet C #


6
C'est une meilleure solution car HttpUtility ne décode pas "& apos;" symbole .. Je ne sais pas pourquoi ..
RredCat

Cela est nécessaire lors du développement de la plate-forme Windows universelle.
matthewsheets

Cela provoquera-t-il XSS dans les pages Web .Net?
Senura Dissanayake

43

Comme le dit @CQ, vous devez utiliser HttpUtility.HtmlDecode , mais il n'est pas disponible par défaut dans un projet .NET non ASP.

Pour une application .NET non ASP, vous devez ajouter une référence à System.Web.dll. Cliquez avec le bouton droit sur votre projet dans l'Explorateur de solutions, sélectionnez "Ajouter une référence", puis parcourez la liste pour System.Web.dll.

Maintenant que la référence est ajoutée, vous devriez pouvoir accéder à la méthode en utilisant le nom complet System.Web.HttpUtility.HtmlDecodeou insérer une usinginstruction pour System.Webfaciliter les choses.



7

Utilisez Server.HtmlDecodepour décoder les entités HTML. Si vous voulez échapper au HTML, c'est-à-dire afficher le caractère <et >à l'utilisateur, utilisez Server.HtmlEncode.


4
Il peut ne pas y avoir de contexte de serveur (c'est-à-dire lors de l'exécution de cas de test et autres) Je suis tombé dans ce piège avant :)
Rob Cooper

7

Pour décoder le HTML, regardez ci-dessous le code

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

La sortie est comme

 Svendborg Værft A/S

2
Le 'ToString ()' est redondant puisque HtmlDecode renvoie une chaîne
Justin

6

Il convient également de mentionner que si vous utilisez HtmlAgilityPack comme je l'étais, vous devez utiliser HtmlAgilityPack.HtmlEntity.DeEntitize(). Il prend un stringet retourne un string.


1

Écrivez une méthode statique dans une classe utilitaire, qui accepte la chaîne comme paramètre et renvoie la chaîne html décodée.

Incluez le using System.Web.HttpUtilitydans votre classe

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

           return HttpUtility.HtmlDecode(text);
        }else{

         return text;
        }

    }

1

Pour .net 4.0

Ajoutez une référence au System.net.dllprojet avec using System.Net;puis utilisez les extensions suivantes

// 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;
        }
    }

0

Pour les chaînes contenant & # x20; J'ai dû double-décoder la chaîne. Le premier décodage le transformerait en la deuxième passe le décoderait correctement au caractère attendu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.