字符串中的转义序列

本文关键字:转义序列 字符串 | 更新日期: 2023-09-27 17:58:56

我遇到一个问题,如果我传递一个硬编码字符串'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循环来循环字符串中的每个字符,从而构建一个新的字符,来消除额外的转义序列。我也试过字符串生成器。

但我在这里的某个地方没有抓住要点。

因此,如果能为我传递一个变量来代替'x1B|200uF

字符串中的转义序列

提供任何帮助,我们将不胜感激

问题确实存在于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')

在硬编码字符串中,ESC的字符十六进制1B加上字符串|200uF。我还没有看到您的XML,但我想在XML中,您有一个字符串'x1B,它是四个字符'x1B

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

AFAIK,没有办法在XML1.0文档中以ESC的形式包含控制字符。如果XML解析器没有正确地传递它,您可能会尝试将它编码为&#x001B;并自己解析。