Преобразование HTML-объектов в символы Юникода в C#
Я нашел похожие вопросы и ответы для Python и Javascript, но не для C# или любого другого WinRT-совместимого языка.
причина, по которой я думаю, что мне это нужно, заключается в том, что я отображаю текст, который я получаю с веб-сайтов в приложении магазина Windows 8. Е. Г. é
должны стать é
.
или есть способ лучше? Я не показываю веб-сайты или rss-каналы, а просто список веб-сайтов и их названия.
6 ответов
Я рекомендую использовать система.Сеть.WebUtility.HtmlDecode и не HttpUtility.HtmlDecode
.
Это связано с тем, что System.Web
ссылка не существует в приложениях Winforms/WPF/Console, и вы можете получить тот же результат, используя этот класс (который уже добавлен в качестве ссылки во всех этих проектах).
использование:
string s = System.Net.WebUtility.HtmlDecode("é"); // Returns é
Это может быть полезно, заменяет все (насколько мои требования идут) сущности их эквивалентом unicode.
public string EntityToUnicode(string html) {
var replacements = new Dictionary<string, string>();
var regex = new Regex("(&[a-z]{2,5};)");
foreach (Match match in regex.Matches(html)) {
if (!replacements.ContainsKey(match.Value)) {
var unicode = HttpUtility.HtmlDecode(match.Value);
if (unicode.Length == 1) {
replacements.Add(match.Value, string.Concat("&#", Convert.ToInt32(unicode[0]), ";"));
}
}
}
foreach (var replacement in replacements) {
html = html.Replace(replacement.Key, replacement.Value);
}
return html;
}
использовать HttpUtility.HtmlDecode()
.Читайте на msdn здесь
decodedString = HttpUtility.HtmlDecode(myEncodedString)
различное кодирование / кодирование HTML-объектов и HTML-номеров в приложении Metro и приложении WP8.
С Windows Runtime Metro App
{
string inStr = "ó";
string auxStr = System.Net.WebUtility.HtmlEncode(inStr);
// auxStr == ó
string outStr = System.Net.WebUtility.HtmlDecode(auxStr);
// outStr == ó
string outStr2 = System.Net.WebUtility.HtmlDecode("ó");
// outStr2 == ó
}
С Windows Phone 8.0
{
string inStr = "ó";
string auxStr = System.Net.WebUtility.HtmlEncode(inStr);
// auxStr == ó
string outStr = System.Net.WebUtility.HtmlDecode(auxStr);
// outStr == ó
string outStr2 = System.Net.WebUtility.HtmlDecode("ó");
// outStr2 == ó
}
чтобы решить эту проблему, в WP8 я реализовал таблицу в HTML ISO-8859-1 Ссылка перед вызовом System.Net.WebUtility.HtmlDecode()
.
это сработало для меня, заменяет как общие, так и Unicode сущности.
private static readonly Regex HtmlEntityRegex = new Regex("&(#)?([a-zA-Z0-9]*);");
public static string HtmlDecode(this string html)
{
if (html.IsNullOrEmpty()) return html;
return HtmlEntityRegex.Replace(html, x => x.Groups[1].Value == "#"
? ((char)int.Parse(x.Groups[2].Value)).ToString()
: HttpUtility.HtmlDecode(x.Groups[0].Value));
}
[Test]
[TestCase(null, null)]
[TestCase("", "")]
[TestCase("'fark'", "'fark'")]
[TestCase(""fark"", "\"fark\"")]
public void should_remove_html_entities(string html, string expected)
{
html.HtmlDecode().ShouldEqual(expected);
}
улучшенный метод Zumey (я не могу там комментировать). Максимальный размер символа находится в сущности: & восклицание; (11). Верхний регистр в сущностях также возможен, ex. À (источник wiki)
public string EntityToUnicode(string html) {
var replacements = new Dictionary<string, string>();
var regex = new Regex("(&[a-zA-Z]{2,11};)");
foreach (Match match in regex.Matches(html)) {
if (!replacements.ContainsKey(match.Value)) {
var unicode = HttpUtility.HtmlDecode(match.Value);
if (unicode.Length == 1) {
replacements.Add(match.Value, string.Concat("&#", Convert.ToInt32(unicode[0]), ";"));
}
}
}
foreach (var replacement in replacements) {
html = html.Replace(replacement.Key, replacement.Value);
}
return html;
}