字符串中的转义序列

时间:2013-02-13 22:59:29

标签: c# .net wpf

我遇到一个问题,如果我将硬编码字符串\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

来理解任何帮助

2 个答案:

答案 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="&#xFEED;|200uF"/>

在您的C#代码中,相应地替换它:

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

答案 1 :(得分:1)

在硬编码字符串中,1B加上字符ESC的字符为|200uF。我没有看到你的XML,但我想在XML中,字面意思是字符串\x1B,它是四个字符\x1和{{1 }}

这就是两者之间的区别,硬编码和XML。

AFAIK,无法在XML 1.0文档中将控制字符包含在B中。您可能会尝试将其编码为ESC并自行解析,如果XML解析器未正确传递它。