Правильное удаление html сущностей из строки - PullRequest
1 голос
/ 09 января 2020

У меня проблема с удалением 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: text

1 Ответ

1 голос
/ 09 января 2020

Ну &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, так что ... я думаю, что это не проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...