Почему 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 в теме.

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