从字符串中正确删除 html 个实体

Correctly removing html entities from a string

我在从字符串中删除 html 实体时遇到问题。我尝试 System.Web.HttpUtility.HtmlDecode,并希望看到   被常规的 space 取代。相反,返回一个奇怪的十六进制代码。我已经阅读了以下两个主题,了解到这很可能是一个编码问题,但我找不到解决它的方法。

Removing HTML entities in strings

How do I remove all HTML tags from a string without knowing which tags are in it? ("I realize that...", Thierry_S)

应该从html代码和实体中剥离的源字符串以SQL_Latin1_General_CP1_CI_AI作为整理保存在数据库中,但是对于我的单元测试,我只是在[=中创建了一个测试字符串64=],其中的编码不一定要和数据库中存储数据的编码相同

我的单元测试断言 'Not Equal' 因为   没有被常规的 space 替换。最初,它返回 2C,但经过大量测试并尝试从某种编码转换为另一种编码后,它现在 returns A0,即使我已经从我的函数中删除了所有编码更改代码。

我的问题有两个:

  1. 如何让我的单元测试通过?
  2. 我测试正确吗,因为数据库编码可能与我在单元测试中手动输入的文本不同?

我的函数:

public static string StripHtml(string text)
{
    // Remove html entities like  
    text = System.Net.WebUtility.HtmlDecode(text);

    // Init Html Agility Pack
    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(text);

    // Return without html tags
    return htmlDoc.DocumentNode.InnerText;
}

我的单元测试:

public void StripHtmlTest()
{
    // arrange
    string html = "<p>This is&nbsp;a very <b>fat, <i>italic</i> and <u>underlined</u> text,<!-- foo bar --> sigh.</p> And 6 < 9 but > 3.";
    string actual;
    string expected = "This is a very fat, italic and underlined text, sigh. And 6 < 9 but > 3.";

    // act
    actual = StaticRepository.StripHtml(html);

    // assert
    Assert.AreEqual(expected, actual);
}

测试结果:

Message: Assert.AreEqual failed. Expected:<This is a very fat, italic and underlined text, sigh. And 6 < 9 but > 3.>. Actual:<This is a very fat, italic and underlined text, sigh. And 6 < 9 but > 3.>.

十六进制测试结果:

&nbsp;不是'regular'space。当您使用 System.Net.WebUtility.HtmlDecode 时,它将 return 命名的 html 实体的文本表示,即“”。它看起来像普通的白色 space 但它有 different meaningnbsp 的十进制表示实际上是 160,十六进制是 A0,因此您的单元测试和解码工作正常。
如果你想用普通的 whitespace 替换 nbsp 你有几个选择,其中最简单的是在解码之前执行简单替换:

// where the second argument is whitespace char with decimal representation 32
text = text.Replace("&nbsp;", " "); 

关于初始运行: 十六进制值 2C 是十进制的 44,即符号 ','(逗号)。有没有可能你只是看错了角色?

关于 sql 排序规则: 拉丁文通用能够存储 nbsp 符号,所以..我认为这不是问题。