2013-02-13 88 views
2

我遇到一個問題,如果我傳遞一個硬編碼字符串\x1B|200uF作爲參數,該命令會正確接受它。字符串中的轉義序列

但是,當我檢索XML元素相同的值到一個新的字符串變量,我得到以下值:\\x1B|200uF

正如你可以看到有一個額外的轉義序列。

因此,在總結問題:

using (XmlReader xmlReader = XmlReader.Create(@"PosPrinter.xml")) 
       {  
        while (xmlReader.Read()) 
        { 
         if (xmlReader.NodeType == XmlNodeType.Element) 
         { 
          switch (xmlReader.Name) 
          { 
           case "PosPrinter": 
            _printer.LogicalName = xmlReader.GetAttribute("LogicalName"); 
            break; 

           case "FeedReceiptCommand": 
            _printer.FeedReceiptCommand = xmlReader.GetAttribute("value"); 
            break; 

我值檢索到我的「FeedReceiptCommand」字符串正如我上面提到的值存儲在XML作爲\x1B|200uF但檢索到的字符串作爲\\x1B|200uF與在開始時額外的轉義序列。

我然後使用字符串變量FeedReceiptCommand打電話給我的命令:

_posPrinter.PrintNormal(PrinterStation.Receipt, PrinterSettings.FeedReceiptCommand); 

但由於額外的轉義序列的命令不執行。

但如果我叫用值相同的命令硬編碼:

_posPrinter.PrintNormal(PrinterStation.Receipt, "\x1B|200uF"); 

...然後命令被成功執行..

價值\x1B|200uF是ESC命令使用Microsoft.PointOfService發送給Epson TM-T88V打印機,其中'\ x'是用於Hex的,我認爲1B是Hex值。

我hav e試圖通過使用'Trim','Substring',甚至做一個foreach循環來循環字符串中的每個字符以建立一個新字符串來擺脫額外的轉義序列。我也嘗試過stringbuilder。

但我錯過了這裏的某處。

因此,任何幫助會中我如何在地方\x1B|200uF

+1

您能得到什麼,如果你打印出價值?我確信''''只是一個顯示器。 – ChrisF 2013-02-13 23:04:56

回答

3

確實存在於XML文件中的問題在於(如@OlafDietsche指出的那樣)。在C#字符串中,\ x1B表示「代碼爲1B(十六進制)或27(十進制)」的字符,在XML中,它只是四個字符。

所以你必須以不同的方式在XML文檔中編碼特殊字符。理論上,您只需用替換\ x1B,這是說「字符編號1B(十六進制)」的XML方式。然而,在這種特定情況下,問題是在XML中是不允許的。 XML文檔中的有效字符在此定義:http://www.w3.org/TR/xml/#charsets 請注意#x1B不在此範圍內。

您可以使用不同字符來表示XML中的Escape並將其替換爲您的C#代碼。確保使用代理字符a)是有效的XML字符,b)永遠不會用作實際數據。

例如,選擇xFEED作爲您的轉義字符(因爲它很容易識別)。所以,你的文件看起來像:

<FeedReceiptCommand value="&#xFEED;|200uF"/> 

在你的C#代碼,因此替換它:

string actualValue = reader.GetAttribute("value").Replace('\xFEED', '\x1B') 
+0

感謝Andre(&@OlafDietsche)爲您提供的輸入和時間來了解我的問題。安德烈表示,該方法效果很好。 +1再次感謝:) – Kev 2013-02-14 10:31:13

1

傳遞一個變量在硬編碼字符串可以理解的,你有字符的十六進制1BESC加上字符串|200uF。我沒有看到你的XML,但我猜想在XML中,字面意思是字符串\x1B,它是四個字符\,x,1B

這就是硬編碼和XML之間的區別。

AFAIK,在XML 1.0文檔中沒有辦法將控制字符字面地包含爲ESC。如果你的XML解析器沒有正確傳遞它,你可以嘗試將它編碼爲&#x001B;並自己解析它。

+0

感謝Olaf抽出時間添加您的輸入信息..非常感謝:) +1 – Kev 2013-02-14 10:32:07