gpt4 book ai didi

c# - 如何使用 StreamWriter 逐字(不转义)写入转义字符?

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:55 25 4
gpt4 key购买 nike

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

该经销商接受电子订单。

/r/n单击以从该经销商处订购 {0}。

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

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

当 kvp.Value = "This dealer accept electronic orders./r/nClick to order {0} from this dealer."

这会导致 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 文件阅读代码,并尝试查找并删除显式扩展这些字符序列的部分。如果可能的话,这将是一个更好的通用解决方案。

关于c# - 如何使用 StreamWriter 逐字(不转义)写入转义字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2716253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com