uniapp蓝牙传输中文乱码问题
问题描述:app接收到蓝牙传出过来的二进制数据,1.app进行arrbuff转成16进制字符串
// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('')
}
2.将16进制的字符串转成10进制字符串这里需要特别注意(JS默认是Unicode编码的 也就是UTF-16)你看下你的设备传输过来的是什么编码
// 16进制转字符串
async function hexCharCodeToStr(hex) {
var arr = hex.split(""),
out = "",
len = hex.length / 2;
for (var i = 0; i < len; i++) {
out += String.fromCharCode(parseInt(hex.substr(i * 2, 2), 16));
}
// 此时的out为UTF-8
//蓝牙使用的是UTF-8编码
// 解决乱码问题 (JS默认是Unicode编码的 也就是UTF-16)
return await utf8to16(out)
}
3.解决中文乱码关键【这里以我自己举例,我对接的设备传输的编码是utf-8】我需要把UTF-8编码转成UTF-16下面提供两个方法
function utf8to16(str) {
var out, i, len, c;
var char2, char3;
out = "";
len = str.length;
i = 0;
while (i < len) {
c = str.charCodeAt(i++);
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// 0xxxxxxx
out += str.charAt(i - 1);
break;
case 12:
case 13:
// 110x xxxx 10xx xxxx
char2 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = str.charCodeAt(i++);
char3 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
}
}
return out;
}
function utf16to8(str) {
var out, i, len, c;
out = "";
len = str.length;
for(i = 0; i < len; i++) {
c = str.charCodeAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
out += str.charAt(i);
} else if (c > 0x07FF) {
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
} else {
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
}
}
return out;
}
4,APP蓝牙发送数据给设备需要注意(因为js默认时utf-16的需要转成utf-8)在进行发送,否则设备端也解析不了
// 字符串转16进制 str需要传入设备需要的utf-8(js字符串默认是Unicode编码utf16,需转成设备的utf8)解决中文问题,否则设备处理不了
function strToHexCharCode(str) {
if (str === "")
return "";
var hexCharCode = [];
// hexCharCode.push("0x");
for (var i = 0; i < str.length; i++) {
hexCharCode.push((str.charCodeAt(i)).toString(16));
}
return hexCharCode.join("");
}
5.调用发送数据给设备
//设置wifi
setWifiInfo() {
uni.showLoading({
title: 'wifi网络配置中..',
mask: false
});
//此时需要注意 wifi名为中文需要把中文的utf-16转成utf-8
let body = {
"ssid":that.$lizhao.scale.utf16to8(that.picker.form.ssid),
"password": that.picker.form.password
}
let length = that.$lizhao.scale.switch_sl(JSON.stringify(body).length, 16) // 十进制转十六进制
let stri = '0'
for (let i = 0; i < (7 - length.length); i++) {
stri += '0'
}
let cmd = '0002' //2转成两位的16进制为00 02
let len = stri + length //body的长度为39转成4位的16进制为00 00 00 26
//十进制数据转换为16进制
let body_16 = that.$lizhao.scale.strToHexCharCode(JSON.stringify(body))
let hex = that.Bluetooth.agreement.magic + cmd + that.Bluetooth.agreement.id + len + body_16
let arr = that.splitArr(hex)
//多个指令串行发送,并行可能会失败
that.writeCmd(arr, 0)
},
//arr为hex分割的数组,i为当前数组下标
async writeCmd(arr, i) {
let res = await that.$lizhao.bluetooth.writeBLECharacteristicValue(arr[i])
if (res == 'writeBLECharacteristicValue:ok') {
i++
if (i > arr.length) {
return
}
that.writeCmd(arr, i)
} else {
that.writeCmd(arr, i)
} },
//分割指令每20位分割一下,返回数组
splitArr(hex) {
let arr = []
for (let a = 0; a < Math.ceil(hex.length / 20); a++) {
let str = hex.slice(a * 20, a * 20 + 20)
arr.push(str)
}
return arr
}
uniapp蓝牙传输中文乱码问题的更多相关文章
- java中文乱码解决之道(一)-----认识字符集
沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...
- MAC下 mysql不能插入中文和中文乱码的问题总结
MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...
- java中文乱码解决之道(九)-----总结
乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...
- 解决springmvc+mybatis+mysql中文乱码问题【转】
这篇文章主要介绍了解决java中springmvc+mybatis+mysql中文乱码问题的相关资料,需要的朋友可以参考下 近日使用ajax请求springmvc后台查询mysql数据库,页面显示中文 ...
- freemarker页面中文乱码
一.前言 简单的记录freemarker遇到的错误问题:ftl页面中文乱码 由于freemarker整合在ssm框架中,所以笔者直接贴配置代码 <beans xmlns="http:/ ...
- tomcat项目中文乱码问题解决方法
在部署tomcat项目时经常会遇到中文乱码问题,解决的方法可参考以下步骤. 1.更改Tomcat安装目录下的conf\server.xml,指定浏览器的编码格式为"utf-8"格式 ...
- IE下get传中文乱码的问题 -- 解决方案 (js)
W3school 函数 JavaScript 全局对象 定义和用法 encodeURI() 函数可把字符串作为 URI 进行编码. 语法 encodeURI(URIstring) 参数 描述 URIs ...
- JSP和Servlet的中文乱码处理
JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下.应该是可以解决日常的乱码问题了.现在作以下总结希望对需要的人有所帮助.我 ...
- Git bash下中文乱码问题
Git bash下中文乱码--解决方案 解决办法1: 在git bash下,右键 出现下图,选择options: 选择"Text" 将Character set设置为 UTF-8 ...
随机推荐
- Hadoop【MR的分区、排序、分组】
[toc] 一.分区 问题:按照条件将结果输出到不同文件中 自定义分区步骤 1.自定义继承Partitioner类,重写getPartition()方法 2.在job驱动Driver中设置自定义的Pa ...
- 转 GSON
转 https://www.jianshu.com/p/75a50aa0cad1 GSON弥补了JSON的许多不足的地方,在实际应用中更加适用于Java开发.在这里,我们主要讲解的是利用GSON来操作 ...
- JDBC(3):PreparedStatement对象介绍
一,PreparedStatement介绍 PreperedStatement是Statement的子类,它的实例对象可以通过Connection.preparedStatement()方法获得,相对 ...
- mysql 报 'Host ‘XXXXXX’ is blocked because of many connection errors'
1. 问题:服务启动时,日志报错,导致启动失败: Caused by: com.mysql.cj.exceptions.CJException: null, message from server: ...
- eclips 配置一个tomcat,启动多个不同端口的web项目
前提: 记录这个文章是因为在网上查资料,很多都是,用eclips.配置多个tomcat,就像下面图这样配置两个tomcat 去启动不同的web: 运动多个web 项目,设置不同的端口,需要多个tomc ...
- NSData NSDate NSString NSArray NSDictionary 相互转化
// NSData NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; ...
- 【论文笔记】Modeling User Exposure in Recommendation
Modeling User Exposure in Recommendation [论文作者]Dawen Liang, David M. Blei, etc. WWW'16 Columbia Univ ...
- LuoguP7285 「EZEC-5」修改数组 题解
Content 有一个长度为 \(n\) 的 \(0/1\) 串,你可以修改当中的一些元素,求修改后最长的连续为 \(1\) 的子串长度减去修改次数的最大值. 数据范围:\(1\leqslant n\ ...
- java 编程基础:【注解】 提取注解信息,利用自定义注解编写测试类,注解绑定事件
提取注解信息 使用注解修饰了类.方法.成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应工具来提取并处理注解信息. Java使用java.lang.annotation.Annotat ...
- libevent源码学习(6):事件处理基础——event_base的创建
目录前言创建默认的event_baseevent_base的配置event_config结构体创建自定义event_base--event_base_new_with_config禁用(避免使用)某一 ...