用C#解码HTML文本

本文关键字:文本 HTML 解码 | 更新日期: 2023-09-27 18:24:29

我有一个助手方法:

public static string StripHtml(this string text)
{
    text = HttpUtility.HtmlDecode(text);
    text = Regex.Replace(text, @"<(.|'n)*?>", "");
    return text;
}

还有一个单元测试:

[Test]
public void StripHtmlConvertsNbspEntityIntoSpace()
{
    string result = "A&nbsp;B".StripHtml();
    Assert.AreEqual("A B", result);
}

当我运行单元测试时,它失败了,并出现以下错误:

 String lengths are both 3. Strings differ at index 1.
  Expected: "A B"
  But was:  "A B"
  ------------^

所以我的问题是,为什么&nbsp;没有被解码成一个空间字符?

用C#解码HTML文本

amp;nbsp被解码成一个不间断的空格字符,而不是空格字符,为用户查找相同但却是另一个字符。

如果你按alt+255,这是不间断空格alt+32,如果你想看的话,这是标准空格。

您可以保存文本输出,并在十六进制编辑器中查看它,在那里您应该注意到它得到了另一个十六进制值,而不是普通空间

;是一个不同于空间的角色。单元测试正确。看见http://en.wikipedia.org/wiki/Space_character

HTML实体;不代表一个空间,它代表一个不间断的空间。不间断空格具有字符代码160:string nbspace="''u00A0";

不间断空间根本不是空间,所以如果你想要一个空间,你必须替换它

var text = HttpUtility.HtmlDecode(HttpUtility.HtmlDecode("A&nbsp;B"));
text = Regex.Replace(text, @"<(.|'n)*?>", "");
byte[] c = Encoding.ASCII.GetBytes(text.ToString());
byte[] x = Encoding.ASCII.GetBytes("A B");