6
收藏
评论

小程序蓝牙打印爬坑之旅

小程序蓝牙打印乱码问题解决办法

因为公司要在小程序上加蓝牙打印标签功能,所以就开始接触小程序的蓝牙打印,看文档还是蛮详细的,而且还有demo,顺着demo,一步一步下来还是蛮顺畅的,原以为很快就能完成。没想到坑来了,由于demo中writeBLECharacteristicValue只是写入了一个16进制的数据,而现实中是需要发送字符串的,而且小程序必须要是arrayBuffer,就必须将字符串转arrayBuffer了,好,网上搜下,准备打印了吱吱吱咦,怎么有乱码啊,怎么中文都乱码了。。这下可糟了!于是就去各种找答案。最后知道问题了:原来是因为我们公司用的打印机是智能支持GB2312编码格式的二进制的,但是字符串是utf-8,诶,又得爬坑。经过一天的努力,终于找到解决方法啦,感谢csdn的大大们。实现的代码如下

//计算arraybuffer的长度
sumStrLength(str) {
var length = 0;
var data = str.toString();
for (var i = 0; i < data.length; i++) {
if (this.isCN(data[i])) { //是中文
length += 2;
} else {
length += 1;
}
}
return length;
},

//混杂
hexStringToBuff(str) { //str=‘中国:WXHSH’
const buffer = new ArrayBuffer((this.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 (this.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)
}
}
console.log(String.fromCharCode.apply(null, new Uint8Array(buffer)));
return buffer;
},

//js正则验证中文
isCN(str) {
if (/[1]+$/.test(str)) {
return true;
} else {
return false;
}
},
将中文转化为GB2312编码格式再转成arrayBuffer就大功告成啦,把这个文章记录下来,希望可以帮助到其他小程程们。如有需要,加我Q:786914253


  1. \u3220-\uFA29 ↩︎

最后一次编辑于  03-19  (未经腾讯允许,不得转载)
复制链接赞 6收藏投诉评论

2 个评论

  • 马旭东
    马旭东
    03-21

    辛苦了。

    03-21
    赞同
    回复
  • 飞鸿先森          ༽
    飞鸿先森 ༽
    09-18

    我的小程序蓝牙打印没反应什么情况,

    wx.writeBLECharacteristicValue(Object object)

    都返回OK了的,但是打印机没反应,求解答

    09-18
    赞同
    回复