response.write编码错误

时间:2011-01-27 13:29:34

标签: c# encoding c#-4.0 response.write

我在Web应用程序中有一个字符串 字符串是这样的:

`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|

编码后(通过使用Server.Encode())显示以下内容:

`1234567890-=[]\\ ;&#39;,./\\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|

这是正确的

但是,当我使用Response.Write(theSecondExample)时,结果如下:

`1234567890-=[]\ ;&#39;,./\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|

缺少反斜杠!

输出怎么可能不是我的预期?我该如何预防?

1 个答案:

答案 0 :(得分:5)

没有错误 - 您正在验证调试器中的字符串,它会自动转义字符串 - 例如"Hello \ Goodbye"将在调试器中显示为"Hello \\ Goodbye"

也就是说,调试器的行为会有所不同,具体取决于您查看字符串的方式(当然还有C#/ VB):

  • 将鼠标悬停在字符串(最常见)上,您将获得工具提示中的转义版本
  • 观看窗口/本地等也显示转义版本
  • 如果您选择“文字”直观设置器,您将看到未转义的版本 - ,这是您应该采取的措施来实际验证您的字符串。
  • Html visualiser正如它在锡上所说的那样:)

更新

好的,所以我更进一步,激发VS2010,请创建一个测试项目并跟进。

[TestMethod]
public void TestMethod1()
{
  string a = @"`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:""<>?|";
  Console.WriteLine("Original:");
  Console.WriteLine("{0}", a);
  string htmlEncoded = System.Web.HttpUtility.HtmlEncode(a);
  Console.WriteLine("Html Encoded:");
  Console.WriteLine("{0}", htmlEncoded);
}

(显然我最初使用了一个逐字字符串,以避免除了双引号之外的任何转义)。

测试的控制台输出是:

Original:
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
Html Encoded:
`1234567890-=[]\ ;&#39;,./\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|

同样,如果断点测试结束并开始与可视化工具混淆:

悬停(a):

"`1234567890-=[]\\ ;',./\\~!@#$%^&*()_+{}|:\"<>?|"

即。它在工具提示中被C#转义并被引号括起来。

悬停(htmlEncoded):

"`1234567890-=[]\\ ;&#39;,./\\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|"

..再次,它是html编码 C#通过引号转义

文字(htmlEncoded):

`1234567890-=[]\ ;&#39;,./\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|

..没有c#逃避

Html(htmlEncoded):

`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|

当然新的罗马剧本:)

我相信我们会把我们带回原来的字符串 - 这也表明你所描述的场景不是这样的 - 除非你已经读过一个转义字符串为“正确”,而事实上它并非如此。 Html不需要转义\