如何将转义字符转换为ANSI字符串中的XML
当我使用C#编写的Windows服务将原始字符串发送到使用转义序列在打印机内启动功能的收据打印机时。如:如何将转义字符转换为ANSI字符串中的XML
\x1b\x64\x02
操作切纸器。
我在另一台服务器上使用收据模板文件,并将基本64编码的文本放入XML中,以将其发送给Windows服务。问题在于,当从XML中提取文本时,文本字面上打印在收据上,这与转义字符未被翻译有关。我猜测,当我将这些转义序列输入到Visual Studio中时,它表示字符串中的ANSI字符(因为它在我这样做时起作用,然后切纸器触发)。
如何将包含转义序列的字符串转换为在C#Windows服务中使用的正确格式?目标是将这些简单的转义序列输入到模板文件中,然后在另一端正确转换它们。
C#代码我有在正试图解码底座64,然后转换为ANSI编码的时刻:
byte[] data = Convert.FromBase64String(content);
content = Encoding.Default.GetString(data);
byte[] utf8Bytes = Encoding.UTF8.GetBytes(content);
content = Encoding.GetEncoding("Windows-1252").GetString(utf8Bytes);
return RawPrinterHelper.SendStringToPrinter(getConfig().receiptPrinter, content);
下面是由服务接收到的测试接收的内容:
XHgxYlx4MWRceDYxXHgxIE1OSG9tZU91dGxldC5jb20yMzAwIFdlc3QgSGlnaHdheSAxMw0KQnVybnN2aWxsZSwgTU4gNTUzMzcNCjk1Mi0yNzktMTU4Nw0KDQpceDFiXHgxZFx4NjFceDBceDFiXHg0NFx4Mlx4MTBceDIyXHgwIERhdGU6IDIwMTctMDYtMTVceDkgVGltZTogMzo0NmFtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KXHgxYlx4NDUgU0FMRSANClx4MWJceDQ2
当我基地例如64编码\x7
,
- 从服务中:
Bw==
(如ASCII) - 从服务中:
BwA=
(为Unicode) - 从PHP中的字符串:
XHg3
所以我已经找到了解决办法,需要一个少量变化到模板的:
在模板侧,使用PHP,我的\x7
风格的unicode参考转换为
然后之前我基地64编码它:
$receipt_str = mb_convert_encoding($receipt_str, 'UTF-8', 'HTML-ENTITIES');
这工作到目前为止。我只是不确定是否有更好的方法,或者是否有限制。
我们需要看到一些代码,理想的是[mcve]显示XML是如何生成的。也就是说,根据[XML Standard 1.0(第四版)](https://www.w3.org/TR/2006),'\ x1b'和'\ x02'是无效的Unicode字符代码,以包含在XML文件中/ REC-xml-20060816 /#charsets)支持['XmlWriter'](https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter(v = vs.110).aspx)。因此,如果您使用'XmlWriter',这些字符可能会被转义。 – dbc
您可能还想使用'\ uNNNN'字符文字格式而不是'\ xNN'格式。由于[这里](https://stackoverflow.com/a/32175520/3744182)解释的原因,它不太容易出错。 – dbc
我更新了答案。自从base 64对收据的内容进行编码以便从等式中削减XML遵从性以来,我就已经做好了准备。 –