没有错误 - 您正在调试器中验证字符串,它会自动转义字符串 - 例如"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-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
同样,如果您在测试结束处设置断点并开始使用可视化工具:
悬停 ( a
):
"`1234567890-=[]\\ ;',./\\~!@#$%^&*()_+{}|:\"<>?|"
即它是在工具提示中转义并用引号括起来的C#。
悬停 ( htmlEncoded
):
"`1234567890-=[]\\ ;',./\\~!@#$%^&*()_+{}|:"<>?|"
.. 再次,它是 html 编码和C# 用引号转义
文字(htmlEncoded
):
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
.. 没有 c# 转义
html ( htmlEncoded
):
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
当然是时代新罗马文字:)
我相信这会让我们回到原始字符串——这也表明你所描述的场景不可能是这种情况——除非你已经将转义字符串读为“正确”,而实际上并非如此。Html 不需要\
转义。