web-dev-qa-db-fra.com

Conversion d'entités HTML en caractères Unicode en C #

J'ai trouvé des questions similaires et des réponses pour Python et Javascript, mais pas pour C # ou tout autre langage compatible WinRT. 

La raison pour laquelle je pense en avoir besoin, c’est que j’affiche du texte provenant de sites Web dans une application Windows 8 Store. Par exemple. é devrait devenir é.

Ou y a-t-il un meilleur moyen? Je n’affiche pas de sites Web ni de flux RSS, mais simplement une liste de sites Web et de leurs titres.

32
Remy

Je recommande d'utiliser System.Net.WebUtility.HtmlDecode et NOTHttpUtility.HtmlDecode

Cela est dû au fait que la référence System.Web n'existe pas dans les applications Winforms/WPF/Console et que vous pouvez obtenir exactement le même résultat en utilisant cette classe (qui est déjà ajoutée comme référence dans tous ces projets).

Utilisation:

string s =  System.Net.WebUtility.HtmlDecode("é"); // Returns é
58
Blachshma

Cela peut être utile, remplace toutes les entités (dans la mesure de mes besoins) par leur équivalent Unicode.

    public string EntityToUnicode(string html) {
        var replacements = new Dictionary<string, string>();
        var regex = new Regex("(&[a-z]{2,5};)");
        foreach (Match match in regex.Matches(html)) {
            if (!replacements.ContainsKey(match.Value)) { 
                var unicode = HttpUtility.HtmlDecode(match.Value);
                if (unicode.Length == 1) {
                    replacements.Add(match.Value, string.Concat("&#", Convert.ToInt32(unicode[0]), ";"));
                }
            }
        }
        foreach (var replacement in replacements) {
            html = html.Replace(replacement.Key, replacement.Value);
        }
        return html;
    }
11
zumey

Utilisez HttpUtility.HtmlDecode() .Lead on msdn here

decodedString = HttpUtility.HtmlDecode(myEncodedString)
7
Mudassir Hasan

Codage/codage différent des entités HTML et des nombres HTML dans les applications Metro App et WP8 App.

Avec Windows Runtime Metro App

{
    string inStr = "ó";
    string auxStr = System.Net.WebUtility.HtmlEncode(inStr);
    // auxStr == &#243;
    string outStr = System.Net.WebUtility.HtmlDecode(auxStr);
    // outStr == ó
    string outStr2 = System.Net.WebUtility.HtmlDecode("&oacute;");
    // outStr2 == ó
}

Avec Windows Phone 8.0

{
    string inStr = "ó";
    string auxStr = System.Net.WebUtility.HtmlEncode(inStr);
    // auxStr == &#243;
    string outStr = System.Net.WebUtility.HtmlDecode(auxStr);
    // outStr == &#243;
    string outStr2 = System.Net.WebUtility.HtmlDecode("&oacute;");
    // outStr2 == ó
}

Pour résoudre ce problème, dans WP8, j'ai implémenté le tableau dans Référence HTML ISO-8859-1 avant d'appeler System.Net.WebUtility.HtmlDecode().

3
user1954682

Cela a fonctionné pour moi, remplace les entités communes et unicode.

private static readonly Regex HtmlEntityRegex = new Regex("&(#)?([a-zA-Z0-9]*);");

public static string HtmlDecode(this string html)
{
    if (html.IsNullOrEmpty()) return html;
    return HtmlEntityRegex.Replace(html, x => x.Groups[1].Value == "#"
        ? ((char)int.Parse(x.Groups[2].Value)).ToString()
        : HttpUtility.HtmlDecode(x.Groups[0].Value));
}

[Test]
[TestCase(null, null)]
[TestCase("", "")]
[TestCase("&#39;fark&#39;", "'fark'")]
[TestCase("&quot;fark&quot;", "\"fark\"")]
public void should_remove_html_entities(string html, string expected)
{
    html.HtmlDecode().ShouldEqual(expected);
}
0
hcoverlambda

Amélioration de la méthode Zumey (je ne peux pas commenter là-bas). La taille maximale de caractère est dans l'entité: & exclamation; (11). Les majuscules dans les entités sont également possibles, ex. À (Source de wiki )

public string EntityToUnicode(string html) {
        var replacements = new Dictionary<string, string>();
        var regex = new Regex("(&[a-zA-Z]{2,11};)");
        foreach (Match match in regex.Matches(html)) {
            if (!replacements.ContainsKey(match.Value)) { 
                var unicode = HttpUtility.HtmlDecode(match.Value);
                if (unicode.Length == 1) {
                    replacements.Add(match.Value, string.Concat("&#", Convert.ToInt32(unicode[0]), ";"));
                }
            }
        }
        foreach (var replacement in replacements) {
            html = html.Replace(replacement.Key, replacement.Value);
        }
        return html;
    }
0
EminST