繁体   English   中英

如何使用StreamWriter逐字写转义字符(不转义)?

[英]How do I write escape characters verbatim (without escaping) using StreamWriter?

我正在编写一个实用程序,该实用程序接受.resx文件,并创建一个javascript对象,该对象包含.resx文件中所有名称/值对的属性。 一切都很好,直到.resx中的值之一是

该经销商接受电子订单。

/ r / n点击向该经销商订购{0}。

我将名称/值对添加到js对象中,如下所示:

streamWriter.Write(string.Format("\n{0} : \"{1}\"", kvp.Key, kvp.Value));

当kvp.Value =“此经销商接受电子订单。/r/n单击以从该经销商订购{0}。”

这将导致StreamWriter.Write()实际上在“订单”之间放置换行符。 和“点击”,自然会弄乱我的javascript输出。

我已经尝试了@,并且没有使用string.Format,但是没有运气。 有什么建议么?

编辑:此应用程序在构建过程中运行,以便稍后部署一些javascript文件,因此,除了应用程序开发人员之外,任何人都无法访问/运行该应用程序。 因此,尽管我显然需要一种在此处转义字符的方法,但实际上XSS并不是真正的问题。

当您到达此代码时,您的问题已经发生。 String.Format不会将替换后的字符串( {0}等)中的文字\\n\\r “扩展”到换行符和CR中,因此它一定是在更早的时候发生的,可能是在读取.resx文件时发生的。

您有两种可能的解决方案。 正如您在对DonaldRay的答案的评论中所发现的那样,一种方法是显式地取消此替换,并用两个字符\\n替换文字换行符:

kvp.Value.Replace("\r",      // <-- replaced by the C# compiler with a literal CR character
                  "\\r");    // <-- "\\" replaced by the C# compiler with a single "\",
                             // leaving the two-char string "\r"

您将需要对字符串中可能出现的每个字符执行相同的操作。 \\ n和\\ r是最常见的,然后是\\ t(制表符); 对于大多数开发人员工具而言,这可能就足够了。

string formatted = kvp.Value.Replace("\r", "\\r")
                            .Replace("\n", "\\n")
                            .Replace("\t", "\\t");

或者,您可以向上游看.resx文件读取代码,并尝试查找和删除明确扩展这些字符序列的部分。 如果可能的话,这将是更好的通用解决方案。

您需要使用Microsoft的Anti-XSS Library对字符串进行转义。

只是逃避反斜杠。

kvp.Value = kvp.Value.Replace(@"\\", @"\\\\");

从resx文件读取数据时,可能需要执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM