Правильное удаление HTML-сущностей из строки

У меня проблема с удалением html-сущностей из строк. я пытаюсьSystem.Web.HttpUtility.HtmlDecode, и хотел бы увидеть  заменяется обычным пространством. Вместо этого возвращается странный шестнадцатеричный код. Я прочитал следующие две темы и узнал, что это, скорее всего, проблема с кодировкой, но я не могу найти способ ее решить.

Удаление HTML-сущностей в строках

Как удалить все теги HTML из строки, не зная, какие теги в ней?("Я понимаю, что...", Thierry_S)

Исходная строка, которая должна быть удалена из HTML-кодов и сущностей, сохраняется в базе данных с SQL_Latin1_General_CP1_CI_AI в качестве сопоставления, но для своего модульного теста я просто создал тестовую строку в Visual Studio, кодировка которой не обязательно совпадает с кодировкой данных, хранящихся в базе данных.

Мой модульный тест утверждает, что "не равно", поскольку  не заменяется обычным пространством. Изначально он вернулся2C, но после большого количества тестов и попыток преобразовать из одной кодировки в другую теперь возвращается 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.>.

Результат теста в HEX:Текст

1 ответ

Решение

Хорошо &nbsp;не является "обычным" пространством. Когда вы используетеSystem.Net.WebUtility.HtmlDecodeон вернет текстовое представление названной html-сущности, которая является "". Он выглядит как обычный пробел, но имеет другое значение. Десятичное представлениеnbsp на самом деле 160 что в шестнадцатеричном формате A0, поэтому ваш модульный тест и декодирование работают правильно.
Если вы хотите заменитьnbsp с обычными пробелами у вас есть несколько вариантов, самый простой из которых будет выполнять простую замену перед декодированием:

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

О начальном запуске: шестнадцатеричное значение2C является 44в десятичном формате, который является символом ','(запятая). Возможно ли, что вы просто посмотрели не на того персонажа?

О сопоставлении sql: латинский язык вообще может хранить символы nbsp, так что... я думаю, что это не проблема.

Другие вопросы по тегам