java - Java - 在 Android 应用上打印非拉丁字符
问题描述
我有一个 Android 应用程序,我正在尝试使用蓝牙打印机打印一些文本。问题是我无法正确打印任何非拉丁字符。我有这个代码:
public void printTaggedText() throws IOException {
try {
byte[] theText = "Întregul text în românește țș".getBytes("utf8 ");
for (byte bit : theText) {
System.out.println("Reached: " + Integer.toHexString(bit));
}
this.printText(theText);
} catch (Exception e) {}
}
我已经用 for 检查编码是否正确,因此我查看了结果值,它们似乎没问题(我将它们转换回字符串,得到相同的文本)。
这是 printText 函数:
public void printText(byte[] b) throws IOException {
synchronized(this) {
this.write(b);
}
}
这是写:
public synchronized void write(int b) throws IOException {
this.write(new byte[]{(byte)b});
}
public synchronized void write(byte[] b) throws IOException {
this.write(b, 0, b.length);
}
public synchronized void write(byte[] b, int offset, int length) throws IOException {
this.mBaseOutputStream.write(b, offset, length);
}
结果如下所示:
我知道打印机支持这些字符,因为它可以使用另一个应用程序正确打印它们。
解决方案
这些打印机通常工作在 8 位字符模式,不直接理解 UTF-8。相反,您必须使用一些 ESC/POS 命令在打印机中设置正确的代码页,然后在将文本发送到打印机之前将其转换为该代码页。在 BSD/Linux 系统上,您可以使用 iconv 来达到此目的。
推荐阅读
- dynamic - 从 _V_SYS_COLUMNS 表中传递列名以在 Netezza 中创建动态选择查询
- r - 将值格式化为保持数字的百分比
- amazon-web-services - AWS CDK Python - 使用 Route53 进行证书管理器 DNS 验证
- postgresql - 为条件逻辑 postgres 返回单独的查询
- java - 在 Java 中使用 Azure Cosmos DB 发布/订阅的示例
- c++ - C ++:使用堆栈检查字符串中括号和括号的顺序是否正确
- c# - 如何在构建时将用户机密注入 Xamarin.Forms 中的 AndroidManifest?
- c++ - 使用模板将相同的方法应用于许多参数
- api - 从 Googlesheet 发送带有 Twilio api 的 whatsapp
- javascript - React-Redux - 如何处理有效载荷和减速器的嵌套属性实现