Как записать шестнадцатеричную escape-последовательность размером более 7 бит (7F) в массиве JavaScript, чтобы правильно интерпретировать принтер ESC/P?
Я работаю с QZ-лотком, чтобы сделать необработанную печать на принтере ESC/P (не ESC/POS) 9pin [1]. В основном все работает нормально, пока я не установлю абсолютную горизонтальную позицию (ESC $).
проблема та же с [2], но он использует Java и QZ tray, используя JavaScript для своего примера [3], и объявляет все команды, используя шестнадцатеричную escape-последовательность (\xFF) [4], символы от 0 до 255 (\x00) - \xFF).
вот подробно о проблеме:
установить абсолютное горизонтальное положение в 9-контактном ESC/P [1]
ASCII: ESC $ nL nH Hex: 1B 24 nL nH 0 <= nH <= 127 0 <= nL <= 255
отправлять данные в лоток QZ без проблем, если значение nL от 0 до 127.
var data = [ '\x1B' + '\x40', // init '\x1B' + '\x24' + '\x10' + '\x00', // set horizontal '0x10' + '\x0D' + '\x0A', // print position ok '\x1B' + '\x24' + '\x7F' + '\x00', // set horizontal '0x7F' + '\x0D' + '\x0A', // print position ok '\x1B' + '\x24' + '\x80' + '\x00', // set horizontal '0x80' + '\x0D' + '\x0A', // print position PROBLEM '\x1B' + '\x24' + '\x00' + '\x01', // set horizontal '1x00' + '\x0D' + '\x0A', // print position ok ]
как представить символ 128 с помощью шестнадцатеричной escape-последовательности, если '\x80' + '\x00' было неверным?
Я пытался использовать типизированный массив JavaScript Uint8Array и Uint16Array, но печать не удалась, я думаю, это потому, что протокол ESC / P хочет использовать его как символы (массив).
Я попытался выполнить поиск по группам QZ и stackru, но довольно сложно найти правильное ключевое слово.
любая помощь будет оценена. благодарю вас.
[1] https://files.support.epson.com/pdf/general/escp2ref.pdf
[2] ESC / P Установить абсолютную горизонтальную позицию печати
2 ответа
Чтобы помочь кому-то с этой проблемой, в основном я получил ответ из списка рассылки qz-print, это известные ошибки. (но было бы трудно найти ключевое слово, потому что оно связано с необработанной ошибкой кодирования).
самое простое решение для этого (необработанная печать) с добавленной кодировкой ISO-8859-1, чтобы не использовать UTF-8 (который делает символ 128-255 2 байтами).
var config = qz.configs.create(printer, {encoding: 'ISO-8859-1'});
Еще одно решение для этого - использовать print raw в шестнадцатеричном формате. [1] https://qz.io/wiki/2.0-Raw-Printing
вот обсуждение в списке рассылки: [2] https://groups.google.com/forum/
вот обсуждение ранее об ошибке: [3] https://groups.google.com/forum/
и наконец, вот проблема github, если вы хотите отследить ее, когда-нибудь она будет решена. [4] https://github.com/qzind/tray/issues/155
Сила ISO-8859-1
кодирование и использование необработанной шестнадцатеричной записи объекта.
var config = qz.configs.create(printer, {encoding: 'ISO-8859-1'});
var data = [
'...',
'\x1B' + '\x24' + '\x80' + '\x00', // set horizontal
///// RAW HEX OBJECT NOTATION /////
{ type: 'raw', format: 'hex', data: 'x80x0Dx0A' }
//'0x80' + '\x0D' + '\x0A', // print position PROBLEM
'\x1B' + '\x24' + '\x00' + '\x01', // set horizontal
'1x00' + '\x0D' + '\x0A', // print position ok
'...',
]
Обратите внимание, что это тот же общий ответ, который был предложен @oon-arfiandwi, но напечатан в коде.