Печать символов UTF-8 на принтере Bluetooth
У меня есть приложение, в котором я могу печатать на bluetooth-принтере Zebra iMZ320, но у меня есть проблемы с определенными символами UTF-8 (Æ, Ø или Å).
Я подключаюсь к устройству следующим образом:
BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(macAddr);
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { Integer.TYPE });
bSocket = (BluetoothSocket)m.invoke(device, new Object[] { Integer.valueOf(1) });
bSocket.connect();
outStream = bSocket.getOutputStream();
inStream = bSocket.getInputStream();
После того, как сокет открыт, я отправляю данные в CPCL:
String cpclData = "! U1 SETLP 5 2 24 \r\n"+text+"\r\n";
outStream.write(cpclData.getBytes());
outStream.flush();
Но когда я пытаюсь напечатать упомянутые символы, вместо этого он пишет ненормальные символы.
Я связался с Зеброй, и один из их инженеров написал, что я должен попробовать следующее:
! 0 200 200 80 1
IN-MILLIMETERS
JOURNAL
CENTER
COUNTRY NORWAY
TEXT 4 0 0 8 COUNTRY IS NORWAY OR DENMARK
TEXT 4 0 0 15 Æ Ø Å
PRINT
Но это абсолютно ничего не делает.
5 ответов
Юникод не поддерживается на языке CPCL. Вы можете сделать это в ZPL, но iMZ поддерживает ZPL. Проверьте эту ссылку.
Это просто, если вы пытаетесь распечатать этикетку с устройства Android; когда вы пишете данные в кодировке "ISO-8859-1", смотрите:
String cpclData = "! U1 SETLP 5 2 24 \r\n"+text+"\r\n";
outStream.write(EncodingUtils.getBytes(cpclData, "ISO-8859-1"));
outStream.flush();
В моем случае это прекрасно работало с решением, предоставленным @jsanmarb, но с использованием кодовой страницы 850 (Latin-1 - западноевропейские языки), найденной здесь: https://www.ascii-codes.com/cp850.html
Нашел это решение здесь
public byte[] convertExtendedAscii(String input)
{
int length = input.length();
byte[] retVal = newbyte[length];
for(int i=0; i<length; i++)
{
char c = input.charAt(i);
if (c < 127)
{
retVal[i] = (byte)c;
}
else
{
retVal[i] = (byte)(c - 256);
}
}
return retVal;
}
В аналогичной задаче, пытаясь напечатать испанские специальные символы на принтере Zebra MZ220 через Bluetooth, я наконец сделал следующее (в этом ответе я добавляю символы Å, Æ, Ø, å, æ, ø):
Определите фрагмент кода, который преобразует целевую строку в желаемый байтовый массив:
public class Util { public final static String caracteresEspeciales = "ÜüÁáÉéÍíÓóÚúÑñÅÆØåæø"; public final static byte[] codigoCaracteresEspeciales = new byte[] {(byte) 0xDC, (byte) 0xFC, (byte) 0xC1, (byte) 0xE1, (byte) 0xC9, (byte) 0xE9, (byte) 0xCD, (byte) 0xED, (byte) 0xD3, (byte) 0xF3, (byte) 0xDA, (byte) 0xFA, (byte) 0xD1, (byte) 0xF1, (byte) 0xC5, (byte) 0xC6, (byte) 0xD8, (byte) 0xE5, (byte) 0xE6, (byte) 0xF8 }; public static byte[] stringABytes(String s) { int i, l, i_especial; byte b; byte[] b_arr; String s_sub; if(s == null) return null; if((l= s.length()) < 1) return new byte[0]; // convertimos a byte carácter por carácter b_arr= new byte[l]; for(i= 0; i < l; i++) { s_sub= s.substring(i, i + 1); i_especial= Util.caracteresEspeciales.indexOf(s_sub); if(i_especial < 0) b= (s_sub.getBytes())[0]; else b= Util.codigoCaracteresEspeciales[i_especial]; b_arr[i]= b; } return b_arr; } }
Эти шестнадцатеричные коды мы можем получить из документа PROMAN-CPCL, который поставляется с принтером (ПРИЛОЖЕНИЕ C- CHARACTER TABLES, таблица латинского набора символов 1).
Преобразуйте строку и отправьте ее.
String datos_cplc; byte[] b_arr; ... datos_cplc= "! 0 200 200 48 1\r\n" + "TEXT 7 0 0 0 12345678901234567890123456789012\r\n" + "TEXT 7 0 0 25 ÜüÁáÉéÍíÓóÚúÑñÅÆØåæø AEIOUaeiou1\r\n" + "FORM\r\n" + "PRINT\r\n"; b_arr= Util.stringABytes(datos_cplc); ... connection.write(b_arr);
Результат: