如何在 JavaScript 数组中编写大于 7 位 (7F) 的十六进制转义序列,以便由 ESC/P 打印机正确解释?



我正在使用 QZ 托盘使用 ESC/P(不是 ESC/POS)打印机 9pin [1] 进行原始打印。 基本上一切都很好,直到我必须设置绝对水平位置(ESC $)。

问题与 [2] 相同,但它使用 Java,QZ 托盘使用 JavaScript 作为示例 [3],并使用十六进制转义序列 (\xFF) [4],字符从 0 - 255 (\x00 - \xFF) 声明所有命令。

以下是有关问题的详细信息:

  1. 在 9 针电调/P 中设置绝对水平位置 [1]

    ASCII: ESC $ nL nH
    Hex:   1B 24 nL nH  
    0 <= nH <= 127
    0 <= nL <= 255
    
  2. 如果 nL 值为 0 到 127,则将数据发送到 QZ 托盘没有问题。

    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
    ]
    

    如果"\x80"+"\x00"不正确,如何使用十六进制转义序列表示字符 128?

  3. 我尝试使用JavaScript类型数组Uint8Array和Uint16Array,没有成功打印,我认为这是因为ESC/P协议希望它作为字符(array)。

我尝试搜索QZ组和堆栈溢出,但很难找到正确的关键字。

任何帮助将不胜感激。谢谢。

[1]https://files.support.epson.com/pdf/general/escp2ref.pdf

[2]ESC/P 设置绝对水平打印位置

[3]https://qz.io/wiki/2.0 原印

[4]https://mathiasbynens.be/notes/javascript 转义#十六进制

为了帮助解决这个问题的人, 基本上我从qz打印邮件列表中得到了答案, 这是一个已知的错误。 (但是很难找到关键字,因为它是关于原始编码错误)。

最简单的解决方案(原始打印)添加编码 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-原始印刷#十六进制

以下是邮件列表上的讨论: [2]https://groups.google.com/forum/#!topic/qz-print/TE0D-wsRDRg

这是之前关于该错误的讨论: [3]https://groups.google.com/forum/#!topic/qz-print/r3VGPDaYKKE

最后一个,这是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 提出的一般答案相同,但在代码中键入。

最新更新