Настройка таблицы кодов символов для печати нелатинских символов в принтере ESC / POS - PullRequest
0 голосов
/ 04 мая 2018

У меня есть приложение для Android, и я пытаюсь напечатать на нем некоторые тексты, содержащие нелатинские символы.

Я использую этот код для отправки ESC t n команды на принтер:

 byte[] buf = new byte[]{0x1B, 0x74, (byte)2}; // 2 is the codetable for PC850: Multilingual
 this.mBaseOutputStream.write(buf);

Затем я пытаюсь напечатать свой код следующим образом:

this.mBaseOutputStream.write("Лорем ăîîîîîîă".getBytes("cp850"));

Но все, что я получаю за нелатинские символы, это странные символы. Так что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Сначала отправьте байты инициализации ( a.k.a write (); flush (); ) вместо отправки всех данных вместе. Тогда отправьте своих персонажей.

public void print (String text, String codePage, OutputStream os) 
{
    /*Your codetable initialization here.
     *You can refactor this more efficiently.
     *Hardcoded just so you can understand.
     */
    ByteBuffer init = ByteBuffer.allocate(3);
    init.put((byte) 0x1B);
    init.put((byte) 0x74);
    init.put((byte) 2);
    sendData(init.array(), os);

    ByteBuffer dataToPrint = ByteBuffer.allocate(text.length());
    dataToPrint.put(text.getBytes(codePage));
    sendData(dataToPrint.array(), os);
}

private void sendData(byte[] buffer, OutputStream os) throws IOException
{
    try {
        ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
        os.write(byteBuffer.array());
        os.flush();
        // tell the user data were sent

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Вы можете использовать его как;

print("Лорем ăîîîîîîă", "cp852", yourOutputStream); // cp852 or any other codePage you desire.

Если это не сработает, попробуйте закрыть многобайтовую (однобайтовую для европейской области) перед печатью.

ByteBuffer closeMultibyte = ByteBuffer.allocate(2);
closeMultibyte.put((byte) 0x1C);
closeMultibyte.put((byte) 0x2E);
sendData(closeMultibyte.array(), os);
0 голосов
/ 07 мая 2018

Не уверен, что это ответ как таковой, но, надеюсь, с этого все начнется. Также нужно немного места, чтобы объяснить ...

Похоже, кодовая страница 850 не содержит необходимых символов. Простой способ проверить это в автономном режиме - преобразовать обратно в String. Например. :

System.out.println(
        new String("Лорем ăîîîîîîă".getBytes("cp850"), "cp850"));
--> ????? ?îîîîîî?

Ясно, что только î доступно там.

Возможно, вам придется провести несколько экспериментов с альтернативными кодовыми страницами - какой это тип принтера?

Несколько тестов показывают, что для примера строки может потребоваться более одной кодовой страницы, но кто-то другой может знать лучше:

System.out.println(
        new String("Лорем ăîîîîîîă".getBytes("cp852"), "cp852"));
--> ????? ăîîîîîîă
System.out.println(
        new String("Лорем ăîîîîîîă".getBytes("cp855"), "cp855"));
--> Лорем ????????
...