Правильное удаление HTML-сущностей из строки
У меня проблема с удалением html-сущностей из строк. я пытаюсьSystem.Web.HttpUtility.HtmlDecode
, и хотел бы увидеть
заменяется обычным пространством. Вместо этого возвращается странный шестнадцатеричный код. Я прочитал следующие две темы и узнал, что это, скорее всего, проблема с кодировкой, но я не могу найти способ ее решить.
Удаление HTML-сущностей в строках
Как удалить все теги HTML из строки, не зная, какие теги в ней?("Я понимаю, что...", Thierry_S)
Исходная строка, которая должна быть удалена из HTML-кодов и сущностей, сохраняется в базе данных с SQL_Latin1_General_CP1_CI_AI
в качестве сопоставления, но для своего модульного теста я просто создал тестовую строку в Visual Studio, кодировка которой не обязательно совпадает с кодировкой данных, хранящихся в базе данных.
Мой модульный тест утверждает, что "не равно", поскольку
не заменяется обычным пространством. Изначально он вернулся2C
, но после большого количества тестов и попыток преобразовать из одной кодировки в другую теперь возвращается 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.>.
Результат теста в HEX:
1 ответ
Хорошо
не является "обычным" пространством. Когда вы используетеSystem.Net.WebUtility.HtmlDecode
он вернет текстовое представление названной html-сущности, которая является "". Он выглядит как обычный пробел, но имеет другое значение. Десятичное представлениеnbsp
на самом деле 160
что в шестнадцатеричном формате A0
, поэтому ваш модульный тест и декодирование работают правильно.
Если вы хотите заменитьnbsp
с обычными пробелами у вас есть несколько вариантов, самый простой из которых будет выполнять простую замену перед декодированием:
// where the second argument is whitespace char with decimal representation 32
text = text.Replace(" ", " ");
О начальном запуске: шестнадцатеричное значение2C
является 44
в десятичном формате, который является символом ','(запятая). Возможно ли, что вы просто посмотрели не на того персонажа?
О сопоставлении sql: латинский язык вообще может хранить символы nbsp, так что... я думаю, что это не проблема.