flutter - 如何从 Flutter 将亚洲语言打印到热敏打印机?

标签 flutter thermal-printer codepages

我正在使用 Flutteresc_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);

但我得到了这个

result from above commands

我使用了package suggested below这对泰语很有效。我的 ESC/POS 打印机支持泰语的代码页 96 和 255。 96 做错了,但 255 完成了工作。底部对齐不匹配将是因为打印泰语字符需要 3 遍,并且此字符串不包含底部遍字符。

enter image description here

最佳答案

不幸的是,我认为此时 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 .

那么我们该如何解决呢?

  1. 我们可以fork&fix/workaround 设置字符代码表

  2. 使用合适的编码器,比如中文的 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/

相关文章:

android - 从APK/发行版/文件夹安装哪个Flutter APK

dart - 如何在 Flutter SDK 中使用 SVG 或矢量绘图

flutter - 传播运算符(…)不适用于传播列表中的小部件

iOS蓝牙热敏票据打印机,支持哪款?

sockets - UDP 兼容数据包类型

java - 如何在 Android 应用程序的多次调用中保存序列号状态?

linux 为 cp850 设置什么语言环境

firebase - 在 Android 设备上发布时未发送 OTP

c# - 从 Web 服务输出中清除 ASCII 控制字符

Java将标准String转换为CP1250,每个字符只有一个字节