mar*_*cks 4 thermal-printer codepages flutter
我正在使用该Flutter包esc_pos_printer 1.5.0打印到热敏打印机。如果我打印拉丁字符,一切正常。我尝试过使用多语言代码页,但在尝试打印泰语字符时总是失败。我需要能够用英语、泰语、缅甸语、高棉语和越南语打印。此软件包中所有可用的代码页似乎都不支持非拉丁亚洲语言。这对我和其他许多人来说都是一个令人惊叹的事情。
II 向打印机发送 ESC 命令以更改代码页,然后按预期打印泰文和拉丁字符的新代码页。但是,当我尝试打印泰语字符时,我的应用程序崩溃了。
\n\n我从调试器中收到此错误:
\n\nE/flutter (29402): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Invalid argument (string): Contains invalid characters.: "\xe0\xb8\xa2\xe0\xb8\xb4\xe0\xb8\x99\xe0\xb8\x94\xe0\xb8\xb5\xe0\xb8\x95\xe0\xb9\x89\xe0\xb8\xad\xe0\xb8\x99\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x9a"\nE/flutter (29402): #0 _UnicodeSubsetEncoder.convert (dart:convert/ascii.dart:88:9)\nE/flutter (29402): #1 Latin1Codec.encode (dart:convert/latin1.dart:42:46)\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的代码:
\n\nvoid _printReceipt(BuildContext context) {\n\n String ip = \'192.168.1.100\'; \n\n Printer.connect(ip, port: 9100).then((printer) {\n\n printer.sendRaw([27, 116, 255]);\n\n printer.printCodeTable();\n\n printer.println(\'Welcome\');\n\n printer.println(\'\xe0\xb8\xa2\xe0\xb8\xb4\xe0\xb8\x99\xe0\xb8\x94\xe0\xb8\xb5\xe0\xb8\x95\xe0\xb9\x89\xe0\xb8\xad\xe0\xb8\x99\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x9a\');\n\n printer.cut();\n printer.disconnect();\n}\n);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:我尝试将字符串编码为字节并像这样打印
\n\n_bytes = utf8.encode("\xe0\xb8\xa2\xe0\xb8\xb4\xe0\xb8\x99\xe0\xb8\x94\xe0\xb8\xb5\xe0\xb8\x95\xe0\xb9\x89\xe0\xb8\xad\xe0\xb8\x99\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x9a");\n\nprinter.sendRaw(_bytes);\nRun Code Online (Sandbox Code Playgroud)\n\n但我得到了这个
\n\n\n\n我使用了下面建议的软件包,该软件包适用于泰语。我的 ESC/POS 打印机支持泰语代码页 96 和 255。96 人做错了,但 255 人完成了工作。底部对齐不匹配是因为打印泰语字符需要 3 遍,并且该字符串不包含底部遍字符。
\n\n\nesc_pos_printer不幸的是,我认为目前该软件包存在两个问题:
它错过了许多字符代码表,并且它实际上不允许您传递自己的 usingPosCodeTable构造函数,因为它是私有的,但您可以使用手动设置字符表sendRaw
您只能传递可以使用Latin1Codec或GBK 编解码器编码的字符,因为据我所知,仅支持这些字符 - 泰语字符无法使用这些编码 - 这就是引发错误的原因
\n问题实际上归结为编码。对于泰语,打印机可能期望数据采用TIS-620格式。铁。\xe0\xb9\x90 是 240,\xe0\xb9\x91 是 241。
\n// Manually set PosCodeTable - 26 here is the Thai Character Code 18\nprinter.sendRaw([\n 27,\n 116,\n 26\n]);\n \nprinter.sendRaw([240, 241]); // Should print \xe0\xb9\x90 and \xe0\xb9\x91\nRun Code Online (Sandbox Code Playgroud)\n请记住,您确实需要设置字符代码表。我使用泰语字符代码 18 和数字 26,因为这是我的打印机支持的。ESC t要找到正确的字符集代码,您可以在打印机手册中查找命令 - 制造商通常将表格放在那里或只是浏览互联网。
我们可以fork&fix /workaround 设置字符代码表
\n使用适当的编码器,例如中文的 GBK,但它不是内置的,因为 Dart 仅支持少量的编码,并且使用Encoding.getByName("csTIS620")会得到null. 您可能需要自己进行字符映射 - 我没有找到适合您需求的 Dart 编解码器。还有一个包charset_converter使用平台代码来转换字符集。
esc_pos_printer现在通过方法支持票证上的原始字节流textEncoded。这可以与charset_converter一起使用来打印正确的字符。
字符代码表也得到了扩展,即 CP1250。PosStyles这是作为参数设置的codeTable。这些都ecs_pos_utils通过此映射映射到项目中的打印机 ID 。
| 归档时间: |
|
| 查看次数: |
18039 次 |
| 最近记录: |