字符串中的转义序列
本文关键字:转义序列 字符串 | 更新日期: 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="ﻭ|200uF"/>
在您的C#代码中,相应地替换它:
string actualValue = reader.GetAttribute("value").Replace(''xFEED', ''x1B')
在硬编码字符串中,ESC
的字符十六进制1B
加上字符串|200uF
。我还没有看到您的XML,但我想在XML中,您有一个字符串'x1B
,它是四个字符'
、x
、1
和B
。
这就是硬编码和XML之间的区别。
AFAIK,没有办法在XML1.0文档中以ESC
的形式包含控制字符。如果XML解析器没有正确地传递它,您可能会尝试将它编码为
并自己解析。