2012-08-02 136 views
3

首先,嗨!,這是我的第一篇文章!C#如何閱讀 r n字符串

我正在寫一個應用程序來讀取和寫入串行端口,所有工作都很好,但由於在我們公司我們有不同類型的掃描儀,它們配置了不同的前綴/後綴字符,其中大多數都有\ 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; DR

我怎樣才能讓 「\ r \ n」 從XML文件中讀取值讀取,而不是 「\\ \\ [R N」 完全一樣,?

編輯:

正如爾卡Hanika建議,我只是改變了我的字符串從 「\ r \ n」 來的ASCII碼,因爲這樣的:

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

現在我的應用程序是爲兩種類型的掃描儀工作,我正在測試它。

謝謝!

+0

您可以存儲新代碼的ASCII碼,並將其解析爲代碼中的實際字符。只是一個想法。 – Justin 2012-08-02 16:27:42

+0

stringbuilder會有用嗎?也許StringBuilder.AppendLine();?基本上將你的數據保存到一個stringBuilder的變量中,並在每一行添加\ r \ n? – plast1K 2012-08-02 16:28:21

+3

該值可能是'\ r \ n',但是當您在調試器中查看該變量時,它將會將其轉義。 – SwDevMan81 2012-08-02 16:28:44

回答

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> 
+0

This Works!我現在試着用ASCII碼來做,因爲它聽起來像是一種更好的方法。 – desto 2012-08-02 16:38:06

+0

@desto - 我添加了一種也依賴於ASCII碼的方法,並且不需要您根本將您的代碼更改爲答案。 – 2012-08-02 16:46:54

+0

對不起,我看到它並實現它,但忘了在這裏回覆,這個將會像其他掃描儀使用其他字符一樣,並以這種方式我可以覆蓋它們。 – desto 2012-08-02 17:34:11

2

我認爲你的方法有一點誤解。 \r\n是一個「符號」,可以這麼說,它表示按順序回車和換行。這個「符號」(或一組)僅對編譯器有效 - 對於其他任何內容,甚至對運行時代碼都沒有任何意義。

編譯器在編譯時將它們轉換爲二進制表示。所以,當你做

var str = "\r\n"; 

編譯器實際存儲是這樣的:

{ 0xD, 0xA } 

(這裏沒有暗示一個字符串是一個數組...我不知道如何將字符串存儲英寸淨,也不應該)

所以,編譯器正在解釋和轉換你的'代碼'到別的東西。我的看法是,由於你正在將編譯器帶出等式(通過讀取運行時的值),你必須完成它的工作。

所以,下面這個理由,我會讀取配置文件的內容,然後在「解釋」是:

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

當然,因爲這是所有代表,我相信會是一個更美好方法是使用其他表達式來表示新行。您的配置可能會顯示爲:

<rPortSuffix>CarriageReturn-NewLine</rPortSuffix> 

哪一個更清晰。在代碼中,你會這樣做:

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