【问题标题】:Encode only accented characters in an HTML string仅对 HTML 字符串中的重音字符进行编码
【发布时间】:2021-06-21 12:44:45
【问题描述】:

我有以下接受 HTML 字符串的函数,例如"<p>áêö</p>"

public string EncodeString(string input)
{
    // ...
    return System.Net.WebUtility.HtmlEncode(input);
}

我想修改该函数以输出相同的字符串,但将重音字符作为 HTML 实体。使用 System.Net.WebUtility.HtmlEncode() 对整个字符串进行编码,包括 HTML 标记。如果可能,我想保留 HTML 标记,因为字符串在应用程序的其他地方被解析和呈现。这是用正则表达式更好地解决的问题吗?

【问题讨论】:

  • 为什么要对 unicode 字符进行编码?只需使用utf-8 作为您的网络编码(无处不在),然后浏览器就会愉快地显示 unicode 字符串。
  • System.Net.WebUtility.HtmlEncode(input).Replace( '<','<').Replace( '>','>');
  • @PoulBak 尽管这是理想的解决方案,但我目前无法控制输入字符串的来源(它们已经作为 HTML 字符串传递)以及哪些应用程序呈现它们(我可以说最好它是不是现代浏览器吗)

标签: c# .net encoding html-entities


【解决方案1】:

这很可能是最奇怪的解决方案,但是...

public static string EncodeString(string input)
{
    string startTag = input.Substring(0, input.IndexOf(">") + 1);
    string endTag = input.Substring(input.IndexOf("</"), startTag.Length + 1);
    input = input.Substring(startTag.Length, input.Length - endTag.Length - startTag.Length);
    return startTag + System.Net.WebUtility.HtmlEncode(input) + endTag;
}

【讨论】:

  • 这不适用于嵌套标签,例如&lt;p&gt;áê&lt;i&gt;áê&lt;/i&gt;&lt;/p&gt;
  • @PoulBak 是的,没想到
【解决方案2】:

您可以使用AngleSharp 之类的库来替换 html 元素的内容:

public static async Task<string> EncodeString(string input)
{
    var context = BrowsingContext.New(Configuration.Default);
    var document = await context.OpenAsync(req => req.Content(input));
    var pElement = document.QuerySelector("p");
    pElement.TextContent = System.Net.WebUtility.HtmlEncode(pElement.TextContent);
    return pItem.ToHtml();
}

在此处查看实际操作:.NET Fiddle


对于嵌套元素的更一般情况,以下是修改后的代码:

public static async Task<string> EncodeString(string input)
{
    var context = BrowsingContext.New(Configuration.Default);
    var document = await context.OpenAsync(req => req.Content(input));
    return await EncodeString(document.Body.FirstChild);
}

private static async Task<string> EncodeString(INode content)
{
    foreach(var node in content.ChildNodes)
    {
        node.NodeValue = node.NodeType == NodeType.Text ?
            System.Net.WebUtility.HtmlEncode(node.NodeValue) :
            await EncodeString(node);
    }
    return content.ToHtml();
}

【讨论】:

  • 这不适用于嵌套标签,例如&lt;p&gt;áê&lt;i&gt;áê&lt;/i&gt;&lt;/p&gt;
  • 这并不完美,但我扩展了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2011-07-02
  • 2011-10-24
  • 2014-04-16
  • 2012-03-16
相关资源
最近更新 更多