Почему HtmlEncode и HtmlDecode не изоморфны в.NET?
Я нахожу это удивительным и довольно раздражающим.
Пример:
Decode(”) => ”
Encode(”) => ”
Соответствующие занятия:
.NET 4: System.Net.WebUtility
.NET 3.5: System.Web.HttpUtility
Я могу понять, что веб-страница может быть Unicode, но в моем случае вывод не может быть UTF8.
Есть ли что-то (возможно, класс HtmlWriter), которое могло бы сделать это без необходимости заново изобретать колесо?
Альтернативное решение:
string HtmlUnicodeEncode(string input)
{
var sb = new StringBuilder();
foreach (var c in input)
{
if (c > 127)
{
sb.AppendFormat("&#x{0:X4};", (int)c);
}
else
{
sb.Append(c);
}
}
return sb.ToString();
}
1 ответ
Невозможно создать изоморфную пару кодеков HTML. Рассматривать:
HtmlDecode("”””””") -> ”””””
как вы вернетесь из ”””””
к исходной строке?
HtmlEncode
должен выбрать одну кодировку для ”
и это идет на ”
как самая короткая, самая читаемая альтернатива. Пока вы работаете с Unicode, это почти наверняка лучший выбор.
Если вы этого не сделаете, это еще один аргумент... преимущество ”
является то, что это немного более читабельно, чем ”
, но он работает только в HTML (не XML), и вам все равно придется прибегать к ссылкам на символы для всех символов Unicode, которые не имеют встроенных имен сущностей, поэтому он менее согласован. Для кодировщика ссылок на символы создайте XmlTextWriter
используя кодировку ASCII и вызов writeString
в теме.