宸之虫
宸之虫
  • 发布:2019-04-01 16:46
  • 更新:2019-08-20 15:19
  • 阅读:2973

【报Bug】蓝牙打印API写入中文乱码(包括安卓、IOS)

分类:HTML5+

详细问题描述

(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)
[内容]
官方示例蓝牙打印中文汉字乱码(并尝试过多种转码方式都不行),经测试安卓和IOS都是如此。

重现步骤

[步骤]
// 写入特征值数据
function writeValue(){
if(!deviceId){
plus.nativeUI.toast('未选择设备!');
return;
}
if(!bconnect){
plus.nativeUI.toast('未连接蓝牙设备!');
return;
}
if(!serviceId){
plus.nativeUI.toast('未选择服务!');
return;
}
if(!wcharacteristicId){
plus.nativeUI.toast('未选择写入的特征值!');
return;
}
var value = document.getElementById('writevalue').value;
if(!value || value==''){
plus.nativeUI.toast('请输入需要写入的数据');
document.getElementById('writevalue').focus();
return;
}
// 转换为ArrayBuffer写入蓝牙
str2ArrayBuffer(value, function(buffer){
outSet('写入蓝牙设备的特征值数据: ');
plus.bluetooth.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: wcharacteristicId,
value: buffer,
success: function(e){
outLine('写入数据成功!');
},
fail: function(e){
outLine('写入数据失败! '+JSON.stringify(e));
}
});
});
}

function str2ArrayBuffer(s,f) {
    var b = new Blob([s],{type:'text/plain'});
    var r = new FileReader();
    r.readAsArrayBuffer(b);
    r.onload = function(){if(f)f.call(null,r.result)}
}

IDE运行环境说明

[ HBuilderX ] 1.8.1
[mac版本号] macOS Mojave 10.14.3

App运行环境说明

[Android版本号] 8.0.0
[iOS版本号] 12.1.4
[手机型号] 小米5S、IPHONE 6S PLUS

联系方式

[QQ] 280189004

2019-04-01 16:46 负责人:无 分享
已邀请:
DCloud_App_Array

DCloud_App_Array

中文乱码的问题是字符编码的问题,js中字符串默认使用的是utf8编码。
请联系蓝牙设备厂商确认其支持的字符编码类型及配置方法。
注意:蓝牙API提供的writeBLECharacteristicValue方法写入的是二进制数据,二进制数据的格式要求应根据设备厂商的要求配置。

  • 宸之虫 (作者)

    感谢回复,已经解决!被【二进制】给扰乱,走了长时间的弯路。


    1、在后台转换为指定字符集的字节数组:

    String utf8String = "金";

    byte[] arr = utf8String.getBytes("GBK");


    将byte数组拼接成字符串,传递给前端,前端再分割组成JS数组传递给API即可:


                var bytes = [-67,-16];  //分割得到的字节数组   
    plus.bluetooth.writeBLECharacteristicValue({
    deviceId: deviceId,
    serviceId: serviceId,
    characteristicId: wcharacteristicId,
    value: bytes,
    success: function(e){
    outLine('写入数据成功!');
    },
    fail: function(e){
    outLine('写入数据失败! '+JSON.stringify(e));
    }
    });

    2019-04-08 17:17

  • 9***@qq.com

    回复 宸之虫: 解决乱码。安卓的吗。楼主

    2019-05-30 18:19

  • 太2真人

    回复 宸之虫: 我只能接到一个字符,我这边车蓝牙接受设备测试端只接到一个字符,用的是官方的实例

    2019-11-25 16:50

  • 太2真人

    回复 宸之虫: 我只能接到一个字符,我这边车蓝牙接受设备测试端只接到一个字符,用的是官方的实例,。我也被二进制绕乱了。额

    2019-11-25 17:39

  • 太2真人

    回复 宸之虫: 前端再分割组成JS数组传递给API即可:


            var bytes = [-67,-16];  //分割得到的字节数组      

    这样蓝牙端也接不到数据啊

    2019-11-25 17:40

云飞扬啊

云飞扬啊 - up up up~

求可跑通的demo,uniapp,可付费。

  • 宸之虫 (作者)

    新建项目时,可以选择示例模板,那些模板就是DEMO

    2019-05-27 12:59

  • 云飞扬啊

    回复 宸之虫: 我要的是可跑通的uni-app蓝牙打印的,可以跑通的demo,不是官方那些demo,官方那些demo没有蓝牙的。

    2019-05-30 10:01

7***@qq.com

7***@qq.com

var outputStream = bluetoothSocket.getOutputStream();
let invoke = plus.android.invoke;
outputStream.write(invoke('测试', 'getBytes', 'gbk'))

打印机是HP Officejet 100 蓝牙能连接也能打印 就是中文乱码 上面是打印的输出 能帮我看看啥问题吗?
编码格式难道不是gbk? gb2312 utf8 也都试过了 是不是写法有问题 大神请帮忙解答

该问题目前已经被锁定, 无法添加新回复