Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用StreamWriter逐字(不转义)编写转义字符?_C#_String_Format_Streamwriter - Fatal编程技术网

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

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}

我正在编写一个实用程序,它接收.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实际上在“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");