HttpUtility.HtmlDecode让我发疯

时间:2010-05-20 13:51:42

标签: c# html-encode

这种情况让我发疯了!!:以下片段不起作用(我应该这样做)

...
string preResult =  doc.DocumentNode.SelectSingleNode("//textarea[@name='utrans']").InnerText
return HttpUtility.HtmlDecode(preResult);
...

第一行将值(例如)"<b> Dummy value: </ b>分配给preResult(这是预期的)。

但是下一行给了AGAIN相同的值!!!但它应该返回“< b> Dummy value:< / b>”。

调试这些行我想把这个值直接复制并粘贴到HttpUtility.HtmlDecode()中并猜猜它是什么工作!!!我得到了预期的价值!

当然这没用,但它证明了一些奇怪的事情......什么?!!

有没有人再遇到同样的情况? (dev.env.VS2008,.NET3.5SP1)

3 个答案:

答案 0 :(得分:1)

未披露的“第一行分配价值”一步是这里的罪魁祸首。根据使用的内容,分配的值将被双重编码。

// .Dump() is a helper "display" method in LinqPad .Net snippet compiler. 
// Replace with Console.Write(

var na = GetCreateXmlNode("a");

na.InnerText = "<b> Dummy value: </ b>";

na.InnerXml.Dump();
System.Web.HttpUtility.HtmlDecode(na.InnerXml).Dump();
na.InnerText.Dump();
System.Web.HttpUtility.HtmlDecode(na.InnerText).Dump(); // <- Must double-Decode

na.InnerXml = "&lt;b&gt; Dummy value: &lt;/ b&gt;";

na.InnerXml.Dump();
System.Web.HttpUtility.HtmlDecode(na.InnerXml).Dump(); // <- or this if you want appearance of "parity"
na.InnerText.Dump(); // <- just use this
System.Web.HttpUtility.HtmlDecode(na.InnerText).Dump();

输出:

// Results of assigning pre-encoded string to .InnerText
&amp;lt;b&amp;gt; Dummy value: &amp;lt;/ b&amp;gt; // raw xml contents
&lt;b&gt; Dummy value: &lt;/ b&gt;  // double-encoding, single-decoding
&lt;b&gt; Dummy value: &lt;/ b&gt;  // double-encoding, single-decoding
<b> Dummy value: </ b> // double-encoding, double-decoding

// Results of assigning pre-encoded string to .InnerXml
&lt;b&gt; Dummy value: &lt;/ b&gt; // raw xml contents
<b> Dummy value: </ b> // single-encoding, single-decoding, but too messy.
<b> Dummy value: </ b> // single-encoding, single-decoding
<b> Dummy value: </ b> // single-encoding, double-decoding

当您使用.InnerText进行分配时,使用.InnerXml,然后使用HTMLDecode,您确实得到了您指定的内容 - 编码字符串和HTMLDecode似乎已损坏。 事实上,你的方法是破碎的。你对HTML编码两次(一次是手动,然后透明地通过.InnerText中的setter),但只解码一次。

如果您的目标是获得“相同的价值”,请使用相同的方法: 1. HTMLEncode + .InnerXml Setter,.InnerXml getter + HTMLDecode,或 2.跳过HTMLEncode / Decode。只需使用.InnerText setter,然后使用getter。

.InnerText仅编码不需要破坏XML的内容。

na.InnerText = "<b> Dummy value: </ b>";

na.InnerXml.Dump();
System.Web.HttpUtility.HtmlDecode(na.InnerXml).Dump();
na.InnerText.Dump(); // <- Just use that to get Decoded string.
System.Web.HttpUtility.HtmlDecode(na.InnerText).Dump();

&lt;b&gt; Dummy value: &lt;/ b&gt;  // raw xml contents
<b> Dummy value: </ b> // single-encoding, single-decoding, but too messy.
<b> Dummy value: </ b> // single-encoding, single-decoding
<b> Dummy value: </ b> // single-encoding, double-decoding

答案 1 :(得分:0)

如果值作为&lt;b&gt; Dummy value: &lt;/ b&gt;存储在XML文件中,那么获取InnerText将自动对文本进行Html解码。没有必要调用HtmlDecode。

答案 2 :(得分:0)

使用InnerHtml代替InnerText

这对我有用:

aDiv.InnerHtml = HttpUtility.HtmlDecode(aString);

我用它来在网页上显示格式化文本。