收藏
评论

关于蓝牙打印中文乱码


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 个评论

  • Allons-y
    Allons-y
    2018-05-02

    试了你的代码,能打出来了!!!!!!

    2018-05-02
    赞同
    回复 3
    • 丶落叶归根
      丶落叶归根
      2018-05-14
      请问下导入encoding.js 需要改动encoding.js 的源码么..还是直接引用
      2018-05-14
      回复
    • 霍午安
      霍午安
      2018-05-15
      安卓手机也能打印吗?
      2018-05-15
      回复
    • 小刘
      小刘
      2018-05-21回复霍午安
      可以打印的,按我说的方法试一下
      2018-05-21
      回复
  • 小刘
    小刘
    2018-04-28

    HM-A300,目前就试了ios的,Android还没测过

    2018-04-28
    赞同
    回复
  • Allons-y
    Allons-y
    2018-04-27

    请问,你用的什么打印机,安卓和苹果都能用吗

    2018-04-27
    赞同
    回复

正在加载...

登录 后发表内容