【发布时间】:2017-06-19 18:13:30
【问题描述】:
当我使用用 C# 编写的 Windows 服务将原始字符串发送到收据打印机时,该收据打印机使用转义序列来启动打印机内的功能。如:
\x1b\x64\x02
操作切纸机。
我在另一台服务器上使用收据模板文件,并将基于 64 位编码的文本放入 XML 以将其提供给 Windows 服务。问题是当从 XML 中提取文本时,文本会按字面意思打印在收据上,这与未翻译的转义字符有关。
我猜当我在 Visual Studio 中键入这些转义序列时,它代表字符串中的 ANSI 字符(因为当我这样做时它会起作用然后切纸机触发)。
我如何将包含转义序列的字符串转换为在 C# Windows 服务中使用的正确格式?目标是将这些简单的转义序列输入到模板文件中,然后在另一端正确转换它们。
我目前正在尝试解码 base 64 然后转换为 ANSI 编码的 C# 代码:
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
例如,当我使用 base 64 编码 \x7 时,
- 来自服务内部:
Bw==(ASCII 格式) - 从服务内部:
BwA=(作为 Unicode) - 来自 php 中的字符串:
XHg3
【问题讨论】:
-
我们需要查看一些代码,最好是minimal reproducible example,显示 XML 是如何生成的。话虽如此,根据
XmlWriter支持的XML Standard 1.0 (fourth edition),\x1b和\x02是包含在 XML 文件中的无效 Unicode 字符代码。因此,如果您使用XmlWriter,这些字符可能会被转义。 -
您可能还想使用
\uNNNN字符文字格式而不是\xNN格式。由于here 解释的原因,它不太容易出错。 -
我更新了答案。我已经对收据的内容进行了 base 64 编码,以消除 XML 合规性。
-
上面的代码显示了您如何解码
content字符串。首先你是如何编码的? -
我正在使用
base64_encode在 PHP 中编码一个字符串。该字符串是呈现的 phtml 文件的内容。收据将 \x1b 等字面打印到纸上。但如果我使用 Visual Studio 将 \x1b 直接写入服务端的字符串,则不会。