如何在C#中读取 \r\n 字符串

3

首先,你好!这是我的第一篇文章!

我正在开发一个应用程序来读写串口,一切都运作得很好,但由于在我们公司中有不同类型的扫描仪,它们配置了不同的前缀/后缀字符,其中大多数都有\r\n序列。

因此,我决定将这个后缀包含在我的xml配置文件中,如下所示:

<rPortSuffix>\r\n</rPortSuffix>

当我阅读我的XML文件时,我使用这个。
case "rPortSuffix":
    srPortSuffix = xmlReader.Value;
break;

问题在于,当将文本值传递给srPortSuffix时,变量存储的是"\\r\\n"而不是"\r\n",因此当我尝试读取串行端口时,由于错误的后缀字符串(对于NewLine常量),什么都没有发生。
spRead.NewLine = srPortSuffix; //NewLine constant read in XML file
sReadData = spRead.ReadLine(); //Storing the read data 

所以我尝试了:

srPortSuffix= Regex.Replace(srPortSuffix, @"\\", @"\"); 

但是没有成功。有什么建议吗?

简洁版:

如何使从xml文件读取的“\r\n”值被精确地读取,而不是“\\r\\n”?

编辑:

如Jirka Hanika所建议的那样,我只是将字符串从“\r\n”更改为ascii代码,例如:

<rPortSuffix>&#13;&#10;</rPortSuffix>

现在我的应用程序已经可以与我测试的两种类型的扫描仪配合使用了。

谢谢!


你可以存储换行符的ASCII代码,然后在代码中解析为实际字符。这只是一个想法。 - Justin
StringBuilder有用吗?也许可以使用StringBuilder.AppendLine();?基本上是将数据保存到一个StringBuilder变量中,并使用\r\n附加每一行? - plast1K
3
变量的值可能是\r\n,但当您在调试器中查看该变量时,它将被转义。 - SwDevMan81
然而,当程序运行时,它并不会停止在那个序列上,所以问题不可能仅仅出在那里。我正在尝试通过ASCII码进行识别。 - desto
2个回答

5
你可能混淆了实际的字符串数据和它们在C#源代码中的表示方式。当然,C#语法不适用于XML文件,所以\r\n与换行序列无关。
代码并没有将其转换为\\r\\n,但也没有将其转换为换行序列。
最简单的做法是:
srPortSuffix = srPortSuffix.Replace(@"\r", "\r").Replace(@"\n", "\n");

你基本上要做的是,在任何C#源代码之外完全模拟C#编译器通常为你执行的操作。
还有更简单的替代方案,不需要转换任何内容,直接将换行符序列直接放入XML文件中即可。
<rPortSuffix>
</rPortSuffix>

这可能会被某些读者误解或破坏您的漂亮打印约定(结束标记不会缩进)。在XML中以更脏但可能更实用的方式编写相同内容的方法:

<rPortSuffix>&#13;&#10;</rPortSuffix>

这个可行!我现在正在尝试使用ASCII码来实现,因为这似乎是更好的方法。 - desto
@desto - 我添加了一个方法,它也依赖于ASCII码,并且不需要你改变任何代码就能得到答案。 - Jirka Hanika
抱歉,我看到并实现了它,但忘记在这里回复了,这个可以用作其他扫描器使用其他字符的方式,通过这种方式我可以覆盖所有情况。 - desto

2
我认为你的方法存在一些误解。 \r\n 是一个“符号”,它表示回车和换行,依次进行。这个“符号”(或一组符号)只对编译器有效,对其他任何东西都没有意义,甚至对运行时代码也是如此。
编译器在编译时将其转换为二进制表示形式。因此,当你执行以下操作时:
var str = "\r\n";

编译器实际上存储了类似以下内容的东西:
{ 0xD, 0xA } 

(这里并不意味着字符串是一个数组...我不知道在 .Net 中字符串是如何存储的,你也不应该知道)

因此,编译器正在解释和转换您的“代码”为其他东西。我的观点是,由于您将编译器从方程式中剔除(通过在运行时读取值),您必须完成其工作。

因此,按照这种推理,我会读取配置文件的内容,然后“解释”它:

if (srPortSuffix == "\\\\r\\\\n")
{
    actualPortSuffix = "\r\n";
}

当然,由于这只是代表性的,我认为更好的方法是使用其他表达式来表示新行。你的配置可以如下:

<rPortSuffix>CarriageReturn-NewLine</rPortSuffix>

更清晰的方法是在代码中这样写: ```

```
if (srPortSuffix == "CarriageReturn-NewLine")
{
    actualPortSuffix = "\r\n";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接