C# 如何使用StreamWriter逐字(不转义)编写转义字符?
我正在编写一个实用程序,它接收.resx文件并创建一个javascript对象,其中包含.resx文件中所有名称/值对的属性。这一切都很好,直到.resx中的一个值 该经销商接受电子订单 /r/n单击可从此经销商处订购{0} 我正在向js对象添加名称/值对,如下所示:C# 如何使用StreamWriter逐字(不转义)编写转义字符?,c#,string,format,streamwriter,C#,String,Format,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(string.Format("\n{0} : \"{1}\"", kvp.Key, kvp.Value));
当kvp.Value=此经销商接受电子订单时。/r/n单击从该经销商订购{0}
这导致StreamWriter.Write实际上在“orders.”和“Click”之间放置了一条换行符,这自然会破坏我的javascript输出
我尝试过使用@和不使用string.Format的不同方法,但运气不好。有什么建议吗
编辑:此应用程序在构建期间运行,以便稍后部署一些javascript文件,因此除了应用程序开发人员之外,任何人都无法访问/运行它。因此,虽然我显然需要一种在这里转义字符的方法,但XSS本身并不是一个真正的问题。您需要使用Microsoft的转义字符串。您需要使用Microsoft的转义字符串。只需转义反斜杠即可 kvp.Value=kvp.Value.Replace@\,@\
在读取resx文件时,可能需要执行此操作。只需避开反斜杠即可 kvp.Value=kvp.Value.Replace@\,@\
在读取resx文件时,您可能需要执行此操作。当您获取此代码时,您的问题已经发生。String.Format不会将替换字符串{0}等中的文字\n和\r展开为换行符和CR,因此它一定发生在较早的某个点,可能是在读取.resx文件时 您有两种可能的解决方案。正如您在对DonaldRay答案的评论中所发现的,其中之一是显式地反转此替换,并用两个字符替换文字换行符\n:
或者,您可以向上游查看.resx文件读取代码,并尝试查找并删除显式扩展这些字符序列的部分。如果可能的话,这将是一个更好的通用解决方案。当您使用此代码时,您的问题已经发生了。String.Format不会将替换字符串{0}等中的文字\n和\r展开为换行符和CR,因此它一定发生在较早的某个点,可能是在读取.resx文件时 您有两种可能的解决方案。正如您在对DonaldRay答案的评论中所发现的,其中之一是显式地反转此替换,并用两个字符替换文字换行符\n:
或者,您可以向上游查看.resx文件读取代码,并尝试查找并删除显式扩展这些字符序列的部分。如果可能的话,这将是一个更好的通用解决方案。尝试过这个方法,但由于某些原因它不起作用。“替换”似乎不想替换\。好吧,交易如下。我最终使用了这个解决方案,但语法必须是kvp.Value=kvp.Value.Replace\r,@\\r。我认为这是因为\r和\n是字符串中唯一的字符-C无法识别单个\r,它只是\n或\r字符的一部分。所以,更多的工作,但它似乎把我带到我想去的地方。我愿意就这个或链接进行更多的讨论/解释,因为我觉得它突出了一些重要的弦原则,我只是不知道它们是什么!不,这很有道理。”\r'是字符串中的单个字符。当您将此回车替换为@\\r时,您将放置两个反斜杠和一个r,因为@符号不包含转义字符。当streamwriter写入字符串时,它会看到\\r.\\被解释为“\”,并且r按正常方式打印。尝试此操作后,由于某种原因它无法工作。“替换”似乎不想替换\。好吧,交易如下。我最终使用了这个解决方案,但语法必须是kvp.Value=kvp.Value.Replace\r,@\\r。我认为这是因为\r和\n是字符串中唯一的字符-C无法识别单个\r,它只是\n或\r字符的一部分。所以,更多的工作,但它似乎把我带到我想去的地方。我愿意就这个或链接进行更多的讨论/解释,因为我觉得它突出了一些重要的弦原则,我只是不知道它们是什么!不,这很有道理。”\r'是字符串中的单个字符。当您将此回车替换为@\\r时,您将放置两个反斜杠和一个r,因为@符号不包含转义字符。当streamwriter写入字符串时,它会看到\\r.\\被解释为“\”,而r是按正常方式打印的。在我现在这样做之前,我粗略地看了一下。我使用XmlDocument.LoadXml读取.resx文件,然后在doc.SelectNodesxpath字符串Node.ChildNodes[1].InnerText中使用ForEachNode。看来,到了
e当我触摸节点.ChildNodes[1].InnerText时,特殊字符已经展开。假设不值得从XmlDocument实现转换过来,对此有什么想法吗?在我现在这样做之前,我粗略地做了一下。我使用XmlDocument.LoadXml读取.resx文件,然后在doc.SelectNodesxpath字符串Node.ChildNodes[1].InnerText中使用ForEachNode。似乎在我触摸Node.ChildNodes[1].InnerText时,特殊字符已经展开。假设不值得从XmlDocument实现转换过来,有什么想法吗?
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"
string formatted = kvp.Value.Replace("\r", "\\r")
.Replace("\n", "\\n")
.Replace("\t", "\\t");