2012-01-27 60 views
1

这是我的代码:为什么我用相同的HtmlDecode()函数得到不同的结果?

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 

这是错误的(我已经对其进行解码......具有相同功能)。

为什么会这样?

+0

on HTML!呃... HtmlDecode的功能应该是一样的:O为什么两个不同的解码?这是我的问题!删除它不是解决方案(也因为它做了另一种编码,结果将是选择下拉选项中的字符) – markzzz 2012-01-27 15:34:49

+0

我相当肯定你只是做出了一个不正确的假设这里。尝试将HtmlDecode的结果分配给一个变量并将其传递给Response.Write和ListItem ctor,并且您可能会看到相同的结果,在这种情况下,罪魁祸首就在其他地方。 – Rytmis 2012-01-27 15:39:13

+0

作为一种证明我的观点的方法,我创建了一个示例应用程序,并将您的代码粘贴到页面的Page_Init函数中:http://postimage.org/image/l7598yb4h/正如您所看到的,结果对于两个下拉列表和Response.Write。 – Rytmis 2012-01-27 15:42:39

回答

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> 

和工作的事情出很好。 :-)

[编辑]

它发生,我认为从我的例子,它可能不是很清楚,为什么你看到与像“A”向人物的行为。这是因为许多字符编码不支持混淆字母,因此对于控制编写者来说,简单地对7位ASCII字符集之外的所有字符进行编码可能是最容易的。 :-)

[编辑2]

现在越来越清楚,我认为原来的职位并没有提供真正的问题。显然,markzzz试图做的是从数据库中取未编码的HTML,并按照原样显示给客户端。已经存在一个WebForms控件来执行此操作:LiteralControl。它会显示任何你坚持的内容,未经编码。

也就是说,我不知道如何嵌入DropDownList的内部 - 请参阅我对解析HTML呈现方式的解释。但是,如果您只想显示项目列表,但不一定是下拉列表,则可以在Repeater或某些类似内部使用LiteralControl

+0

+1非常好的答案。 – Yuck 2012-01-27 16:09:09

+0

是的,很好的答案,但对我来说,它没有任何意义的HTML实体的编码。我的意思是:如果它看到'ä'是ä(所以它识别htmlentities)为什么把它放在一个7位ASCII字符? – markzzz 2012-01-30 08:02:28

+0

它松散的数据的一致性... imo ... – markzzz 2012-01-30 08:08:40

3

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

W&#228;hlen 
Wählen 

未编码的变音无效。它们相当于它们的编码版本。

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

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

相关问题