it-swarm.com.ru

Преобразование сущностей HTML в символы Unicode в C #

Я нашел похожие вопросы и ответы для Python и Javascript, но не для C # или любого другого WinRT-совместимого языка. 

Причина, по которой я думаю, что мне это нужно, заключается в том, что я отображаю текст, полученный с веб-сайтов, в приложении магазина Windows 8. Например. é должен стать é.

Или есть лучший способ? Я не показываю веб-сайты или RSS-каналы, а просто список веб-сайтов и их названия.

32
Remy

Я рекомендую использовать System.Net.WebUtility.HtmlDecode и НЕHttpUtility.HtmlDecode

Это связано с тем, что ссылка System.Web не существует в приложениях Winforms/WPF/Console, и вы можете получить точно такой же результат, используя этот класс (который уже добавлен в качестве ссылки во всех этих проектах).

Использование:

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

Это может быть полезно, заменяет все (насколько позволяют мои требования) сущности на их юникод-эквивалент.

    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

Используйте HttpUtility.HtmlDecode(). Читать на msdn здесь

decodedString = HttpUtility.HtmlDecode(myEncodedString)
7
Mudassir Hasan

Различное кодирование/кодирование сущностей HTML и чисел HTML в приложениях Metro и WP8.

С приложением Windows Runtime Metro

{
    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 == ó
}

С 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 == ó
}

Чтобы решить эту проблему, в WP8 я реализовал таблицу в HTML ISO-8859-1 Reference перед вызовом System.Net.WebUtility.HtmlDecode().

3
user1954682

Это работает для меня, заменяет как общие, так и юникодные объекты.

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

Улучшен метод Zumey (я не могу комментировать там). Максимальный размер символа в сущности: & восклицательный знак; (11). Верхний регистр в сущностях также возможен, напр. А (Источник из вики )

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