44

我发现了 Python 和 Javascript 的类似问题和答案,但没有发现 C# 或任何其他 WinRT 兼容语言。

我认为我需要它的原因是因为我正在显示从 Windows 8 商店应用程序中的网站获取的文本。例如é应该变成é.

或者,还有更好的方法?我没有显示网站或 rss 提要,而只是显示网站及其标题的列表。

4

6 回答 6

80

我推荐使用System.Net.WebUtility.HtmlDecode不是 HttpUtility.HtmlDecode

这是因为该System.Web引用在 Winforms/WPF/Console 应用程序中不存在,您可以使用此类(已在所有这些项目中添加为引用)获得完全相同的结果。

用法:

string s =  System.Net.WebUtility.HtmlDecode("é"); // Returns é
于 2012-11-21T11:57:55.553 回答
12

在此处使用HttpUtility.HtmlDecode().Read on msdn

decodedString = HttpUtility.HtmlDecode(myEncodedString)
于 2012-11-21T11:43:59.127 回答
11

这可能很有用,用它们的 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;
    }
于 2014-07-01T16:34:45.763 回答
3

Metro App 和 WP8 App 中 HTML 实体和 HTML 数字的不同编码/编码。

使用 Windows 运行时 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 参考System.Net.WebUtility.HtmlDecode()之前实现了表格。

于 2013-02-05T09:15:45.627 回答
2

这对我有用,替换了常见和 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);
}
于 2016-09-29T18:53:02.347 回答
1

改进的 Zumey 方法(我不能在那里发表评论)。最大字符大小在实体中:&exclamation; (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;
    }
于 2018-09-25T13:39:10.730 回答