为什么HtmlEncode和HtmlDecode在.NET中不同构?

lep*_*pie 4 .net unicode html-encode html-entities

我发现这令人惊讶,而且很烦人.

例:

Decode(”) => ”
Encode(”)       => ”
Run Code Online (Sandbox Code Playgroud)

相关课程:

.NET 4:   System.Net.WebUtility
.NET 3.5: System.Web.HttpUtility
Run Code Online (Sandbox Code Playgroud)

我可以理解一个网页可以是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();
}
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 8

生成同构HTML编解码器对是不可能的.考虑:

HtmlDecode("”””””") -> ”””””
Run Code Online (Sandbox Code Playgroud)

你怎么回到”””””原来的字符串?

HtmlEncode必须选择一种编码,它是最短,最可读的选择.只要您使用Unicode,这几乎肯定是最佳选择.

如果你不这样做,那就是另一个论点...... ”它的优点是它的可读性稍高”,但它只适用于HTML(而不是XML),你仍然需要回到所有Unicode字符的字符引用上.没有内置的实体名称,所以它不太一致.对于字符引用编码器,XmlTextWriter使用ASCII编码创建并调用writeString它.