C# 如何将转义字符从XML中的字符串转换为ANSI
当我使用C#编写的Windows服务将原始字符串发送到收据打印机时,该打印机使用转义序列启动打印机内的功能。例如:C# 如何将转义字符从XML中的字符串转换为ANSI,c#,xml,printing,C#,Xml,Printing,当我使用C#编写的Windows服务将原始字符串发送到收据打印机时,该打印机使用转义序列启动打印机内的功能。例如: \x1b\x64\x02 操作切纸机 我正在另一台服务器上使用一个收据模板文件,并将文本(base64编码)放入XML中,以将其提供给Windows服务。问题是,从XML中提取文本时,文本实际上是打印在收据上的,这与未翻译的转义字符有关 我猜,当我在VisualStudio中键入这些转义序列时,它表示字符串中的ANSI字符(因为当我这样做时,它工作,然后切纸机触发) 如何将包含转义
\x1b\x64\x02
操作切纸机
我正在另一台服务器上使用一个收据模板文件,并将文本(base64编码)放入XML中,以将其提供给Windows服务。问题是,从XML中提取文本时,文本实际上是打印在收据上的,这与未翻译的转义字符有关
我猜,当我在VisualStudio中键入这些转义序列时,它表示字符串中的ANSI字符(因为当我这样做时,它工作,然后切纸机触发)
如何将包含转义序列的字符串转换为在C#Windows服务中使用的正确格式?目标是将这些简单的转义序列键入模板文件,然后在另一端正确地转换它们
我目前拥有的C#代码正在尝试解码base 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);
以下是服务收到的测试回执的内容:
xHGxYLx4MWrcedyXXHgXIE1OSG9TZU91DGXLDC5JB20YMZAWIFDLC3QGSGLNAHDESAXMW0KQNVYBN2AWXSZSWGTU4GNTUZMZCNCjk1Mi0YNzKTM4NW0KDQpCedFixHgXZFx4NJfccedBcedHg0NFx4MLX4mBcEdyxHgHg6IDIdHgTcTcTcTvGgLs0Tg0TgLs0Tg0Ls0Tg0Tg0Tg0Tg0Tg0Ls0Tg0Tg0Ls0Ls0Tg0Tg0Ls0Tg0Ls0Tg0Tg0Ls0Tg0Ls0Ls0Tg0Ls0T
例如,当我使用base64编码\x7
时
- 从服务内部:
Bw==
(作为ASCII)
- 从服务内部:
BwA=
(作为Unicode)
- 从php中的字符串:
XHg3
因此我找到了一个只需对模板进行少量更改的解决方案:
在模板方面,我使用PHP将\x7
样式的unicode引用转换为&x7
然后在我对其进行base64编码之前:
$receipt_str = mb_convert_encoding($receipt_str, 'UTF-8', 'HTML-ENTITIES');
到目前为止,这是有效的。我只是不确定是否有更好的方法,或者这方面是否有限制。我们需要看一些代码,理想情况下是显示XML是如何生成的。也就是说,\x1b
和\x02
是无效的Unicode字符代码,根据所支持的格式包含在XML文件中。因此,如果您使用的是XmlWriter
,这些字符可能会被转义。您可能还希望使用\unnn
字符文字格式,而不是\xNN
格式。出于解释的原因,它不太容易出错。我更新了答案。自Base64之后,我对收据的内容进行了编码,以减少对XML的遵从性。上面的代码显示了如何解码内容字符串。首先,您是如何对其进行编码的?我使用base64\u encode
在PHP中对字符串进行编码。该字符串是呈现的phtml文件的内容。收据将\x1b等逐字打印在纸上。但如果我使用Visual Studio将\x1b直接写入服务端的字符串中,则不会这样做。