在 C# 中将 HTML 实体转换为 Unicode 字符

Posted

技术标签:

【中文标题】在 C# 中将 HTML 实体转换为 Unicode 字符【英文标题】:Converting HTML entities to Unicode Characters in C# 【发布时间】:2012-11-09 15:49:03 【问题描述】:

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

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

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

【问题讨论】:

复制:***.com/questions/5783817/… 其实不是。他有一个不同的问题。 确实是重复的。这个问题只是在最后多了一个你不需要的步骤。 【参考方案1】:

使用HttpUtility.htmlDecode()。阅读msdn here

decodedString = HttpUtility.HtmlDecode(myEncodedString)

【讨论】:

是的,请注意,对于 WinForms 或控制台应用程序,您首先必须添加对 System.Web 程序集的引用。 嗨,我试过这个解决方案,但它不能解码像{这样的字符:( @l19 这是一个公认的 htmlentity 吗?我在这个list 中找不到它。不过,我确实设法在开发的 W3C 规范中找到了它。这可能是它尚未解码的原因。【参考方案2】:

我推荐使用 System.Net.WebUtility.HtmlDecodeNOT HttpUtility.HtmlDecode

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

用法:

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

【讨论】:

“你可以使用这个类得到完全相同的结果” - 不正确。只有 HttpUtility 实现才能正确解码 '作为 WP8 上的撇号。 就我而言,HttpUtility.HtmlDecoded 做正确的事。 很好的解决方案:) 很好的解决方案,但 System.Net.WebUtility.HtmlDecode 的缺点是,如果您为旧 Windows 7 编写代码,您将无法在 .NET Framework 3.5 下找到它。【参考方案3】:

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

使用 Windows 运行时 Metro 应用程序


    string inStr = "ó";
    string auxStr = System.Net.WebUtility.HtmlEncode(inStr);
    // auxStr == ó
    string outStr = System.Net.WebUtility.HtmlDecode(auxStr);
    // outStr == ó
    string outStr2 = System.Net.WebUtility.HtmlDecode("ó");
    // outStr2 == ó

使用 Windows Phone 8.0


    string inStr = "ó";
    string auxStr = System.Net.WebUtility.HtmlEncode(inStr);
    // auxStr == ó
    string outStr = System.Net.WebUtility.HtmlDecode(auxStr);
    // outStr == ó
    string outStr2 = System.Net.WebUtility.HtmlDecode("ó");
    // outStr2 == ó

为了解决这个问题,在 WP8 中,我在调用System.Net.WebUtility.HtmlDecode() 之前实现了HTML ISO-8859-1 Reference 中的表格。

【讨论】:

链接已失效。【参考方案4】:

这可能很有用,将所有(就我的要求而言)实体替换为其 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;
    

【讨论】:

为我的情况工作,但我编辑了“var regex = new Regex("(&[a-z]2,6;)");”的正则表达式有很多长于 5 的 html 字符(如 $eacute; ) 我还建议将正则表达式更改为var regex = new Regex("(&amp;[a-zA-Z]2,7;)");,以便包含&amp;Atilde; 等字符。【参考方案5】:

这对我有用,替换了通用实体和 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);

【讨论】:

【参考方案6】:

改进的 Zumey 方法(我不能在那里发表评论)。最大字符大小在实体中:&exclamation; (11)。实体中的大写也是可能的,例如。 À(来自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;
    

【讨论】:

以上是关于在 C# 中将 HTML 实体转换为 Unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将 XML/HTML 实体转换为 Unicode 字符串 [重复]

如何在 C# 中将 HTML 转换为文本?

在c#中将html转换为json

在 C# 中将字符串转换为比较操作

如何在 Code First c# 中将多个实体引用为一个

如何在硒 c# 中将 Blob 图像转换为位图图像