【问题标题】:Escape Sequence in String字符串中的转义序列
【发布时间】:2013-02-13 22:59:28
【问题描述】:

我有一个问题,如果我将硬编码字符串 \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' 代表十六进制,而 1B 是十六进制值..

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

但我在这里的某个地方漏掉了重点。

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

【问题讨论】:

  • 如果将值打印出来会得到什么?我确定`\`只是一个显示的东西。

标签: c# .net wpf


【解决方案1】:

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

【讨论】:

  • 感谢 Andre ( & @OlafDietsche ) 的意见和时间来查看我的问题。安德烈标记答案,因为该方法效果很好。 +1 再次感谢:)
【解决方案2】:

在硬编码字符串中,ESC 的十六进制字符 1B 加上字符串 |200uF。我还没有看到你的 XML,但我猜在 XML 中,你有字符串 \x1B 字面意思,即四个字符 \x1B

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

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

【讨论】:

  • 感谢 Olaf 抽出宝贵时间添加您的意见。非常感谢 :) +1
猜你喜欢
  • 2021-05-12
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2022-01-26
相关资源
最近更新 更多