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是使用 Microsoft.PointOfService 发送到 Epson TM-T88V 打印机的 ESC 命令,我认为 '\x' 代表十六进制,而 1B 是十六进制值。

我试图通过使用“Trim”、“Substring”来摆脱额外的转义序列,甚至使用 foreach 循环来循环字符串中的每个字符以构建一个新字符。我也试过字符串生成器。

但我在这里的某个地方错过了重点。

因此,我将不胜感激如何通过变量代替\x1B|200uF

4

2 回答 2

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')
于 2013-02-13T23:23:29.077 回答
1

在硬编码字符串中,您有字符 hex 1BforESC加上 string |200uF。我还没有看到您的 XML,但我猜在 XML 中,您确实有字符串,\x1B即四个字符\x和.1B

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

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

于 2013-02-13T23:09:45.897 回答