收藏
回答

蓝牙打印中文乱码

wx.writeBLECharacteristicValue

打印中文乱码,如题


最后一次编辑于  2018-12-20
回答关注问题邀请回答
收藏

4 个回答

  • 曾家琦
    曾家琦
    04-16

    我的解决办法是再github上找到了这个大佬的开源项目。希望对大家有所帮助。

    https://github.com/benioZhang/miniprogram-bluetoothprinter

    小程序蓝牙打印

    04-16
    赞同
    回复
  • SuperEleven
    SuperEleven
    01-24

    楼主用你的方法中文还是打不了,是空白,中文直接被去掉了,难道是我们的gbk转码文件不一样,还是和打印机有关系呢

    01-24
    赞同
    回复 6
    • 于心
      于心
      01-24

      你调用的我上面说的哪个方法呢  调用第一个混杂方法就能处理了

      还有就是查看打印机支持的编码,最好询问厂商

      我之前发的博客介绍了 你看看

      csdn

      01-24
      回复
    • SuperEleven
      SuperEleven
      01-24

      我就用的混杂的,可能是我票据打印机的问题


      01-24
      回复
    • SuperEleven
      SuperEleven
      01-24

      gbk转码的文件是这个的 https://gist.github.com/oldj/eb7f3037a5665d853bd8

      01-24
      回复
    • 于心
      于心
      01-24回复SuperEleven

      你先问问你们蓝牙打印机支持的编码这样子,然后在检查一下代码 gbk应该是一样的,有需要的话你加我 我传给你 1069430666

      01-24
      回复
    • SuperEleven
      SuperEleven
      01-24

      好的,我退掉了,我买了另外一个试试,也是看到其他帖子里发的链接https://item.jd.com/28687083276.html

      介绍说支持微信

      01-24
      回复
    查看更多(1)
  • 于心
    于心
    01-08

    已解决。蓝牙打印机所支持的编码不同,处理的方法也不同

    //混杂
    function hexStringToBuff(str){ //str='中国:WXHSH'
      const buffer = new ArrayBuffer((sumStrLength(str)) + 1)
      const dataView = new DataView(buffer)
      var data=str.toString();
      var p = 0;  //ArrayBuffer 偏移量
      for(var i=0;i<data.length;i++){
        if (isCN(data[i])){ //是中文
          //调用GBK 转码
          var t = gbk.$URL.encode(data[i]);
          for (var j = 0; j < 2; j++) {
            var temp = parseInt(t[j * 2] + t[j * 2 + 1], 16)
            dataView.setUint8(p++, temp)
          }
        }else{
          var temp = parseInt(data.charCodeAt(i).toString(16), 16)
          dataView.setUint8(p++,temp)
        }
      }
      dataView.setUint8(p++, 0x0a)
      return buffer;
    }
     
    //计算arraybuffer的长度
    function sumStrLength(str){
      var length=0;
      var data = str.toString();
      for (var i = 0; i < data.length; i++) {
        if (isCN(data[i])) { //是中文
          length += 2;
        } else {
          length += 1;
        }
      }
      return length;
    }
     
    //js正则验证中文
    function isCN(str){
      if (/^[\u3220-\uFA29]+$/.test(str)) {
        return true;
      } else {
        return false;
      }
    }
     
    //汉字转码
    function hexStringToArrayBuffer(str){
      const buffer = new ArrayBuffer((str.length / 2) + 1)
      const dataView = new DataView(buffer)
      for (var i = 0; i < str.length / 2; i++) {
        var temp = parseInt(str[i * 2] + str[i * 2 + 1], 16)
        dataView.setUint8(i, temp)
      }
      dataView.setUint8((str.length / 2), 0x0a)
      return buffer;
    }
     
    //不带有汉字
    function hexStringToArrayBufferstr(str){
      let val = ""
      for (let i = 0; i < str.length; i++) {
        if (val === '') {
          val = str.charCodeAt(i).toString(16)
        } else {
          val += ',' + str.charCodeAt(i).toString(16)
        }
      }
      val += "," + "0x0a";
      console.log(val)
      // 将16进制转化为ArrayBuffer
      return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
        return parseInt(h, 16)
      })).buffer
    }


    01-08
    赞同
    回复 1
    • 曾家琦
      曾家琦
      04-15

      大佬,留个联系方式。我遇到乱码的问题了。但是还没有解决。

      04-15
      回复
  • 杨圣伟
    杨圣伟
    01-08

    麻烦能提供能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html

    01-08
    赞同
    回复