我遇到一个问题,如果我将硬编码字符串\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'字符串中,我上面提到的值作为\x1B|200uF
存储在xml中,但是作为\\x1B|200uF
检索到字符串中,并在开头添加了额外的转义序列
然后我使用字符串变量FeedReceiptCommand调用我的命令:
_posPrinter.PrintNormal(PrinterStation.Receipt, PrinterSettings.FeedReceiptCommand );
但由于额外的转义序列,命令不会执行。
但是如果我用硬编码的值调用相同的命令:
_posPrinter.PrintNormal(PrinterStation.Receipt, "\x1B|200uF");
...然后命令成功执行..
值\x1B|200uF
是使用Microsoft.PointOfService发送到Epson TM-T88V打印机的ESC命令,其中'\ x'代表Hex我认为而1B是Hex值..
我试图通过使用'Trim','Substring'来摆脱额外的转义序列,甚至做一个foreach循环来循环字符串中的每个char来构建一个新的。我也尝试过stringbuilder。
但我在这里错过了一点。
因此,我将如何通过变量代替\x1B|200uF
答案 0 :(得分:3)
问题在于(正如@OlafDietsche指出的那样)确实存在于XML文件中。在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="ﻭ|200uF"/>
在您的C#代码中,相应地替换它:
string actualValue = reader.GetAttribute("value").Replace('\xFEED', '\x1B')
答案 1 :(得分:1)
在硬编码字符串中,1B
加上字符ESC
的字符为|200uF
。我没有看到你的XML,但我想在XML中,字面意思是字符串\x1B
,它是四个字符\
,x
,1
和{{1 }}
这就是两者之间的区别,硬编码和XML。
AFAIK,无法在XML 1.0文档中将控制字符包含在B
中。您可能会尝试将其编码为ESC
并自行解析,如果XML解析器未正确传递它。