2013-02-13 3 views
2

У меня проблема, если я передаю жестко закодированную строку \x1B|200uF в качестве параметра, она принимает ее правильно.Escape Sequence in String

Но, когда я получить то же значение из элемента 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 с дополнительная escape-последовательность в начале.

Я затем вызвать мою команду, используя переменную FeedReceiptCommand строку:

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

Но команда не выполняется из-за дополнительной последовательности.

Но если я называю ту же команду со значением жёстко:

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

... то команда получает успешно выполнена ..

Значение \x1B|200uF является командой ESC для отправьте на принтер Epson TM-T88V с использованием Microsoft.PointOfService, где «\ x» для Hex, я думаю, и 1B - значение Hex.

I hav e попытался избавиться от дополнительной escape-последовательности, используя «Trim», «Substring» и даже сделав цикл foreach, чтобы закодировать каждый символ в строке, чтобы построить новую. Я также попробовал stringbuilder.

Но я здесь отсутствует где-то здесь.

Таким образом, любая помощь будет оценен в том, как я могу передать переменный вместо \x1B|200uF

+1

Что вы получите, если вы печатаете значение вне дома? Я уверен, что '\\' - это всего лишь дисплей. – ChrisF

ответ

3

Проблема заключается (как указал @OlafDietsche) в файле XML. В строке C# \ x1B означает «символ с кодом 1B (hex) или 27 (dec)», в XML это всего четыре символа.

Таким образом, вам придется кодировать специальный символ внутри вашего XML-документа по-разному. Теоретически, вы просто замените \ x1B на , который представляет собой XML-способ сказать «номер символа 1B (hex)». Проблема в этом конкретном случае, однако, заключается в том, что  не допускается в XML. Действительные символы в документе XML определены здесь: http://www.w3.org/TR/xml/#charsets Обратите внимание, что # x1B не является частью этого диапазона.

Вы можете использовать символ разных символов, чтобы представлять Escape в XML и заменить его внутри вашего кода на C#. Обязательно используйте суррогатный символ, который: a) является допустимым символом XML и b) никогда не будет использоваться в качестве фактических данных.

Например, выберите xFEED в качестве символа escape (как его легко распознать). Таким образом, ваш документ выглядит следующим образом:

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

В коде C#, замените его соответствующим образом:

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

Спасибо Andre (& @OlafDietsche) за ваш вклад и время, потраченное на мою проблему. Отмеченный ответ Андре как метод работал отлично. +1 Еще раз спасибо :) – Kev

1

В закодированной строке, у вас есть символ гекс 1B для ESC плюса строки |200uF. Я не видел ваш XML, но, я думаю, в XML вы буквально введете строку \x1B, которая составляет четыре символа \, x, 1 и B.

В этом разница между двумя, жестко закодированными и XML.

AFAIK, нет способа включить контрольные символы как ESC буквально в документе XML 1.0. Вы можете попытаться закодировать его как &#x001B; и проанализировать его самостоятельно, если он не доставлен должным образом вашим парсером XML.

+0

благодарит Олафа за то, что нашли время, чтобы добавить свой вклад .. высоко оценил :) +1 – Kev