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, @"\\", @"\"); 

但没有成功。有小费吗?

TL;博士

如何使从 xml 文件中读取的“\r\n”值完全像这样读取,而不是“\\r\\n”?

编辑:

正如 Jirka Hanika 所建议的,我只是将字符串从 "\r\n" 更改为 ascii 代码,如下所示:

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

现在我的应用程序适用于我正在测试的两种类型的扫描仪。

谢谢!!

4

2 回答 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>
于 2012-08-02T16:33:49.307 回答
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";
}
于 2012-08-02T16:44:01.557 回答