蓝牙打印中文乱码
发布于 4 年前 作者 wenxiuying 12397 次浏览 来自 问答

wx.writeBLECharacteristicValue

打印中文乱码,如题

4 回复

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

https://image.wxopen.club/content_9a57b93a-4697-11ea-8a8c-001a7dda7111.png

小程序蓝牙打印

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

//混杂
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
}

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

回到顶部