收藏
评论

关于蓝牙打印中文乱码


1、将要打印的内容转换为打印机对应的编码(一般是gbk),可以使用这个库来转:

https://github.com/inexorabletash/text-encoding

示例代码如下:

const encoding = require('../../utils/encoding.js')
let str = "你要打印的内容"
let buffer = new encoding.TextEncoder("gb2312", { NONSTANDARD_allowLegacyEncoding: true }).encode(str).buffer
wx.writeBLECharacteristicValue({
 // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
 deviceId: deviceId,
 // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
 serviceId: serviceId,
 // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
 characteristicId: characteristicId,
 // 这里的value是ArrayBuffer类型
 value: buffer,
 success: function (res) {
   console.log('writeBLECharacteristicValue success', res)
 },
 fail: function (err) {
   console.log('writeBLECharacteristicValue fail', err)
 }
})


2、一般来说转完了发现打印中文还会是乱码,这个很有可能是因为你的打印设备需要有对应的打印指令才可以正确打印内容,建议看下对应的编码手册,示例代码如下:

let str = "! 0 200 200 920 1\n" +
       "PAGE-WIDTH 576\n" +
       ";存根\n" +
       ";SPEED 0\n" +
       ";LINE 0 40 544 40 1\n" +
       "一维条码\n" +
       "SETMAG 0 0\n" +
       "SETBOLD 1"
       "ML 32\n" +
       "TEXT 24 0 0 420 \n" +
       "    上述时间、地点,该机动车未在停车场或道路停车\n" +
       "泊位内停放,根据《阳天省实施(中华人民共和国道路\n" +
       "交通安全法)办法》第五十二条第一款的规定,对以上\n" +
       "事实已作出了图像记录。此告知单及图像记录,将提供\n" +
       "给阳天市公安局阳天交通大队审核。\n" +
       "ENDML\n" +
       "EXT 24 0 0 612 交通警察:\n" +
       "TEXT 24 0 48 644 2016年8月1日\n" +
       "LEFT\n" +
       "B QR 64 708 M 2 U 4 \n" +
       "MA,TO: http://a.app.qq.com/o/simple.jsp?pkgname=com.zicox.easyprint\n" +
       "ENDQR\n" +
       "B QR 362 708 M 2 U 4 \n" +
       "MA,TO: http://a.app.qq.com/o/simple.jsp?pkgname=com.zicox.easyprint\n" +
       "ENDQR\n" +
       "TEXT 24 0 0 848 关注“阳天公安”“阳天交警”\n" +
       "TEXT 24 0 344 848 扫描支付宝支付\n" +
       "PRINT \n"

类似上面的str,使用1中所说的转码方式,应该就可以正确打印出中文了。

3、关于Android打印:

前面的代码在ios上面应该已经可以正确打印中文了,但是试了多款Android机型,发现还是无法打印,经过实验发现,Android端对单次打印的字节数有限制(不超过20个字节),官方文档其实也提过这一点:


所以在打印的时候,由于发送指令不完整,导致不能正确打印出所需要的内容。这时候需要对打印的内容进行分包处理,下面是我的做法:

 let buffer = new encoding.TextEncoder("gb2312", { NONSTANDARD_allowLegacyEncoding: true }).encode(str).buffer

  sendData(buffer)

// //发送数据

  sendData(buffer) {
    let byteLength = buffer.byteLength
    if(byteLength > 0) {
      var that = this
      let deviceId = this.data.deviceId
      let characteristicId = this.data.characteristicId
      let serviceId = this.data.serviceId
      wx.writeBLECharacteristicValue({
        // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
        deviceId: deviceId,
        // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
        serviceId: serviceId,
        // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
        characteristicId: characteristicId,
        // 这里的value是ArrayBuffer类型
        value: buffer.slice(0, 20),
        success: function (res) {
          console.log('writeBLECharacteristicValue success', res)
          if(byteLength > 20) {
            that.sendData(buffer.slice(20, byteLength))
          }
        },
        fail: function (err) {
          console.log('writeBLECharacteristicValue fail', err)
        }
      })
    }
  }
 

每次取前20个字节,递归进行打印,就可以了。

以上就是蓝牙中文打印相关经验分享,希望对大家有帮助

最后一次编辑于  2018-05-02
收藏

13 个评论

  • 韩小韩
    韩小韩
    2020-05-08

    这个库怎么引入项目中啊?

    2020-05-08
    赞同
    回复
  • 飞狐
    飞狐
    2018-12-03

     let buffer = new encoding.TextEncoder("gb2312", { NONSTANDARD_allowLegacyEncoding: trueundefined}).encode(str).buffer   我引用encoding.js报错呀,TextEncoder未定义

    2018-12-03
    赞同
    回复
  • 飞狐
    飞狐
    2018-12-03

    你好,有没有实现过打印图片的场景?如果有的话,能否提供demo参考下,谢谢

    2018-12-03
    赞同
    回复
  • 六一
    六一
    2018-10-10

    楼主使用的是tsc命令打印的,标签模式,我的小票打印机

    2018-10-10
    赞同
    回复 2
    • WingLau
      WingLau
      2019-04-08

      条形码与二维码是怎样实现打印的?可以提供些资料么?目前在实现该功能中,不知道如何下手

      2019-04-08
      回复
    • Pino
      Pino
      2019-11-05回复WingLau
      打印机有专门指令打印条形码和二维码
      2019-11-05
      回复
  • pys
    pys
    2018-07-26

    好帖!!我想问下楼主有试过打印图片吗?打印命令里应该怎么设置

    2018-07-26
    赞同
    回复
  • 范橙(吉栗收银)13280828588
    范橙(吉栗收银)13280828588
    2018-07-15

    看看这个 :https://developers.weixin.qq.com/blogdetail?action=get_post_info&docid=7e85fa4514a56b7928646f96dd4bcabe&highline=%E8%93%9D%E7%89%99%E6%89%93%E5%8D%B0%E6%9C%BA

    2018-07-15
    赞同
    回复
  • 朱兆东18981818883
    朱兆东18981818883
    2018-05-18

    兄弟请教下二维码打印指令你怎么输入的?

    2018-05-18
    赞同
    回复 4
    • 小刘
      小刘
      2018-05-21
      B QR x坐标 y坐标 M 2 U 5 MA, 后面跟你要打印的内容。这个是我这个打印机的指令,不知道你那边是什么样的,可以看下打印机的编程手册
      2018-05-21
      回复
    • WqQueenie
      WqQueenie
      2018-05-24回复小刘
      我用的打印机也是HM-A300的,按你写的方法,打印出来还是文本啊,请问你的编码手册是从哪里看的呢
      2018-05-24
      回复
    • 朱兆东18981818883
      朱兆东18981818883
      2018-05-25
      兄弟能贴一个完整二维码打印示例么?
      2018-05-25
      回复
    • 飞狐
      飞狐
      2018-12-07回复WqQueenie

      我也是用的hma300,用指令打出来二维码也是打印出字符串,请问您这个问题解决了吗?应该是打印机模式的问题,不知道hma300怎么去调节打印模式的!

      2018-12-07
      回复
  • ICode
    ICode
    2018-05-17

    谢谢分享  现在还是用服务端转换

    2018-05-17
    赞同
    回复
  • 丶落叶归根
    丶落叶归根
    2018-05-16

    请问下 安卓HA-300..可以用么..

    2018-05-16
    赞同
    回复
  • Guo😄
    Guo😄
    2018-05-10

    别试验了,蓝牙这一块安卓适配,小程序几乎不能用。

    官方不重视,鸡肋的功能

    2018-05-10
    赞同
    回复

正在加载...

登录 后发表内容