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 } |