从字符串中正确删除 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
,即使我已经从我的函数中删除了所有编码更改代码。
我的问题有两个:
- 如何让我的单元测试通过?
- 我测试正确吗,因为数据库编码可能与我在单元测试中手动输入的文本不同?
我的函数:
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 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.>.
十六进制测试结果:
嗯
不是'regular'space。当您使用 System.Net.WebUtility.HtmlDecode
时,它将 return 命名的 html 实体的文本表示,即“”。它看起来像普通的白色 space 但它有 different meaning。 nbsp
的十进制表示实际上是 160
,十六进制是 A0
,因此您的单元测试和解码工作正常。
如果你想用普通的 whitespace 替换 nbsp
你有几个选择,其中最简单的是在解码之前执行简单替换:
// where the second argument is whitespace char with decimal representation 32
text = text.Replace(" ", " ");
关于初始运行:
十六进制值 2C
是十进制的 44
,即符号 ','(逗号)。有没有可能你只是看错了角色?
关于 sql 排序规则: 拉丁文通用能够存储 nbsp 符号,所以..我认为这不是问题。
我在从字符串中删除 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
,即使我已经从我的函数中删除了所有编码更改代码。
我的问题有两个:
- 如何让我的单元测试通过?
- 我测试正确吗,因为数据库编码可能与我在单元测试中手动输入的文本不同?
我的函数:
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 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.>.
十六进制测试结果:
嗯
不是'regular'space。当您使用 System.Net.WebUtility.HtmlDecode
时,它将 return 命名的 html 实体的文本表示,即“”。它看起来像普通的白色 space 但它有 different meaning。 nbsp
的十进制表示实际上是 160
,十六进制是 A0
,因此您的单元测试和解码工作正常。
如果你想用普通的 whitespace 替换 nbsp
你有几个选择,其中最简单的是在解码之前执行简单替换:
// where the second argument is whitespace char with decimal representation 32
text = text.Replace(" ", " ");
关于初始运行:
十六进制值 2C
是十进制的 44
,即符号 ','(逗号)。有没有可能你只是看错了角色?
关于 sql 排序规则: 拉丁文通用能够存储 nbsp 符号,所以..我认为这不是问题。