【问题标题】:Setting character code table to print non-latin characters in ESC/POS printer设置字符代码表以在 ESC/POS 打印机中打印非拉丁字符
【发布时间】:2018-10-14 20:26:39
【问题描述】:

我有一个 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"));

但我得到的非拉丁字符都是奇怪的符号。 那我做错了什么?

【问题讨论】:

    标签: java android printing escpos


    【解决方案1】:

    不确定这是不是这样的答案,但希望这会让事情开始。也需要一点空间来解释...

    看起来代码页 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"));
    --> Лорем ????????
    

    【讨论】:

      【解决方案2】:

      首先发送初始化字节(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);
      

      【讨论】:

        猜你喜欢
        • 2020-12-12
        • 1970-01-01
        • 2020-07-21
        • 2014-12-14
        • 2015-05-30
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多