为什么我使用相同的HtmlDecode()函数获得不同的结果?

时间:2012-01-27 15:29:34

标签: c# .net html encoding html-entities

这是我的代码:

string myText = "Wählen Sie bitte";
string myTextDecoded = HttpUtility.HtmlDecode(myText);
Response.Write(myTextDecoded);
ddAdulti.Items.Add(new ListItem(myTextDecoded, ""));

在第一种情况下(Response.Write)打印,在我的html文档中:

Wählen Sie bitte

这是正确的!但是在我的html文档上打印选择框的选项:

Wählen Sie bitte

这是错误的(我用相同的函数对它进行解码)。

为什么会出现这种情况?

2 个答案:

答案 0 :(得分:4)

根据您更新的问题,我将对您的理解做出可能不正确的假设。

我猜你正在查看HTML源代码而不理解为什么字符串在一个地方编码而在另一个地方编码未编码。解释相当简单:服务器端控件自动编码其内容,而Response.Write写入原始输出。这有一个原因:服务器端控件通常包含用户输入,这本身就是不安全,所以它会自动编码以防止cross-site scripting attacks,或者在不太危险的情况下,用户输入只是破坏你的页面。

举例来说,想象一下,如果列表没有对内容进行编码,您就这样做了:

ddAdulti.Items.Add(new ListItem("</select>", ""));
ddAdulti.Items.Add(new ListItem("An actual valid value", ""));

最终结果是您的标记看起来像这样:

<select>
    <option></select></option>
    <option>An actual valid value</option>
</select>

正如你所看到的,那显然已经破裂了。你最终得到的东西取决于解释浏览器,但很可能是一个空的下拉列表。

现在,由于控件执行对其内容进行编码,因此标记最终为:

<select>
    <option>&lt;/select&gt;</option>
    <option>An actual valid value</option>
</select>

事情很顺利。 : - )

[编辑]

在我看来,从我的例子来看,你可能不清楚为什么你会看到像'ä'这样的角色的行为。这是因为许多字符编码不支持umlauted字母,因此对于控件编写者来说,简单地编码7位ASCII字符集之外的所有字符可能是最简单的。 : - )

[编辑2]

我越来越清楚,原帖并没有真正描述真正的问题。显然,markzzz尝试做的是从数据库中获取未编码的 HTML 并按原样显示给客户端。已经存在用于执行此操作的WebForms控件:LiteralControl。它将显示您坚持使用的任何内容,未编码。

那就是说,我无法将其嵌入到DropDownList中 - 请参阅我对渲染HTML如何破解的解释。但是,如果您只想显示项目列表,但不一定要显示下拉列表,则可以在LiteralControl内部使用Repeater或其他类似内容。

答案 1 :(得分:3)

您可以用HTML编写这两种变体,两者都可以正常工作(只要文档编码正确)。这两个示例都将生成相同(有效)的HTML和输出:

W&#228;hlen
Wählen

未编码的变音符号无效。它们等同于它们的编码版本。

但是如果你不对它们进行编码,你的页面的编码必须支持德语字符。 UTF-8确实如此。

为什么这两种变体导致不同的HTML? Response.Write不对其输出进行编码,因此您可以输出像"<b>x</b>"这样的HTML。 ListItems对其文本进行编码,因为无论如何都无法在其中输出HTML。通过未编码的文本是没有意义的。