2

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

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

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

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

哪个是对的

但是,当我使用Response.Write(theSecondExample)结果是这样的:

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

反斜杠不见了!

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

4

1 回答 1

5

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

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

  • 将鼠标悬停在字符串(最常见)上,您将在工具提示中获得转义版本
  • Watch window/Locals 等也显示转义版本
  • 如果您选择“文本”可视化工具,您将看到未转义的版本 -这是您实际验证字符串时应该执行的操作。
  • Html 可视化器完全按照它在罐头上所说的那样做:)

更新

好的,所以我更进一步并启动了 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 不需要\转义。

于 2011-01-27T13:41:09.953 回答