- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Flutter
包 esc_pos_printer 1.5.0
打印到热敏打印机。如果我打印拉丁字符,一切正常。我曾尝试使用多语言代码页,但在尝试打印泰语字符时总是失败。我需要能够用英语、泰语、缅甸语、高棉语和越南语打印。此包中的可用代码页似乎都不支持非拉丁语。这对我和其他许多人来说都是一场表演。
II 向打印机发送 ESC 命令以更改代码页,然后按预期打印新的泰语和拉丁字符的代码页。但是,当我尝试打印泰语字符时,我的应用程序崩溃了。
我从调试器收到此错误:
E/flutter (29402): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Invalid argument (string): Contains invalid characters.: "ยินดีต้อนรับ"
E/flutter (29402): #0 _UnicodeSubsetEncoder.convert (dart:convert/ascii.dart:88:9)
E/flutter (29402): #1 Latin1Codec.encode (dart:convert/latin1.dart:42:46)
这是我的代码:
void _printReceipt(BuildContext context) {
String ip = '192.168.1.100';
Printer.connect(ip, port: 9100).then((printer) {
printer.sendRaw([27, 116, 255]);
printer.printCodeTable();
printer.println('Welcome');
printer.println('ยินดีต้อนรับ');
printer.cut();
printer.disconnect();
}
);
}
编辑:我尝试将字符串编码为字节并像这样打印
_bytes = utf8.encode("ยินดีต้อนรับ");
printer.sendRaw(_bytes);
但我得到了这个
我使用了package suggested below这对泰语很有效。我的 ESC/POS 打印机支持泰语的代码页 96 和 255。 96 做错了,但 255 完成了工作。底部对齐不匹配将是因为打印泰语字符需要 3 遍,并且此字符串不包含底部遍字符。
最佳答案
不幸的是,我认为此时 esc_pos_printer
包有两个问题:
它遗漏了许多字符代码表,并且它实际上不允许您使用 PosCodeTable
构造函数传递您自己的代码表,因为它是私有(private)的,但您可以使用 手动设置字符表发送原始数据
您只能传递可以使用 Latin1Codec 编码的字符或 GBK codec因为仅支持这些,据我所知 - 无法使用这些对泰文字符进行编码 - 这就是抛出错误的原因
问题实际上归结为编码。对于泰语,打印商可能希望数据以 TIS-620 的格式出现.铁。 ๐是240,๑是241。
// Manually set PosCodeTable - 26 here is the Thai Character Code 18
printer.sendRaw([
27,
116,
26
]);
printer.sendRaw([240, 241]); // Should print ๐ and ๑
请记住,您确实需要设置字符代码表。我使用泰国字符代码 18 和数字 26,因为这是我的打印机支持的。要找到正确的字符集代码,您可以在打印机手册中查找 ESC t
命令 - 制造商通常将表格放在那里或只是 browse the internet .
我们可以fork&fix/workaround 设置字符代码表
使用合适的编码器,比如中文的 GBK,但它不是内置的,因为 Dart 只支持少数编码,使用 Encoding.getByName("csTIS620")
会得到你空
。您可能需要自己进行字符映射——我没有找到适合您需要的 Dart 编解码器。还有一个包charset_converter使用平台代码转换字符集。
esc_pos_printer
现在通过 textEncoded
方法支持票证上的原始字节流。这可以与 charset_converter 一起使用打印正确的字符。
字符代码表也得到扩展,即 CP1250。这在 PosStyles
中设置为 codeTable
参数。这些映射到 ecs_pos_utils
项目中的打印机 ID,带有 map .
关于flutter - 如何从 Flutter 将亚洲语言打印到热敏打印机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59475607/
我是一名优秀的程序员,十分优秀!