前段时间在Android原生搞的BLE扫码枪又要移植到小程序上来。本以为小程序不支持BLE的,结果一搜,还真支持-_-|| 。

  蓝牙部分问题不大,遇到的主要问题是,小程序环境如何对字符编码进行判断以及如何进行编码转文字的问题。

  扫了一阵,搜到了TextDecoder。结果小程序环境不支持……。

  随后搜到了一个polyfill库, 可以用于小程序。

  https://github.com/inexorabletash/text-encoding

  下载后的文件包含

  encoding.js  和 encoding-indexes.js 两个文件。

  使用时

//只需要引用encoding.js,注意路径
var encoding = require("../../libs/util/encoding.js"); var inputBuffer = new Uint8Array(); //utf8
var string = new encoding.TextDecoder().decode(inputBuffer);
//gbk
string = new encoding.TextDecoder("gbk").decode(inputBuffer);

     坑:utf8编码数组 是能正确转换的, gbk的不行。(2017 5月 v0.6.3这个版本) 调试了下,需要修改encoding.js文件,不知道是不是个bug

//849行
return global['encoding-indexes'][name];
//修改为
return global['encoding-indexes']['encoding-indexes'][name];

另,中文编码常用的有两种“GBK”和“utf8”,因此对于输入数组还是要先做编码判断,才能正确转换为文字。js版本的判断utf8的函数也没有搜到合适的,用之前java 的改了下,下面的亲测可用。

isUTF8(buffer) {

        var isUtf8 = true;
var end = buffer.length;
for (var i = 0; i < end; i++) {
var temp = buffer[i];
if ((temp & 0x80) == 0) { // 0xxxxxxx
continue;
} else if ((temp & 0xC0) == 0xC0 && (temp & 0x20) == 0) { // 110xxxxx 10xxxxxx
if (i + 1 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0) {
i = i + 1;
continue;
}
} else if ((temp & 0xE0) == 0xE0 && (temp & 0x10) == 0) { // 1110xxxx 10xxxxxx 10xxxxxx
if (i + 2 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0 &&
(buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0) {
i = i + 2;
continue;
}
} else if ((temp & 0xF0) == 0xF0 && (temp & 0x08) == 0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
if (i + 3 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0 &&
(buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0 &&
(buffer[i + 3] & 0x80) == 0x80 && (buffer[i + 3] & 0x40) == 0) {
i = i + 3;
continue;
}
}
isUtf8 = false;
break;
}
return isUtf8;
}

小程序字节转GBK及UTF8的更多相关文章

  1. 小程序:将gbk转为utf-8

    是否有过写了半天代码,发现竟然用的GBK编码,然后到主UTF-8上发现中文全部变成乱码了... 下面这个程序,只要输入src的位置,瞬间转换成utf-8 package tools; import j ...

  2. 微信小程序base64编码解码以及utf-8解码

    function base64_encode (str) { // 编码,配合encodeURIComponent使用 var c1, c2, c3; var base64EncodeChars = ...

  3. 支撑京东小程序的开发框架 「Taro」

    Taro 简介 现在支持小程序的平台太多了,例如: 微信小程序 QQ小程序 支付宝小程序 百度小程序 字节跳动小程序 针对他们都各自开发一套的话开发成本就太高了. 如果写一套代码,就能开发出适配这么多 ...

  4. 小程序实现GBK编码数据转为Unicode/UTF8

    首先,不存在一种计算算法将GBK编码转换为Unicode编码,因为这两套编码本身毫无关系. 要想实现两者之间的互转,只能通过查表法实现. 在浏览器中实现编码转换,只需要简单两句: var x = ne ...

  5. mpvue 生成字节跳动小程序的问题!!

    初始化项目文件 $ vue init mpvue/mpvue-quickstart fuck $ cd fuck $ npm install 这个时候就初始化好了,接下来 $ npm run dev: ...

  6. 微信小程序Md5加密(utf-8汉字无影响)

    微信小程序不让使用第三方jqMD5 只好改原生js咯 废话不多说直接贴代码 其实就是将原生function调用改为 module.exports = md5; 文中 红色标注 使用方法 将md5.js ...

  7. 写一个c程序辨别系统是大端or小端字节序

    字节序有两种表示方法:大端字节序(big ending),小端字节序(little  ending) 看一个unsigned short 数据,它占2个字节,给它赋值0x1234.若采用的大端字节序, ...

  8. 彻底搞懂编码 GBK 和 UTF8

    常用编码格式一览 首先来看一下常用的编码有哪些,截图自Notepad++.其中ANSI在中国大陆即为GBK(以前是GB2312),最常用的是 GBK 和 UTF8无BOM 编码格式.后面三个都是有BO ...

  9. ASCII,Unicode,GBK和UTF-8字符编码的区别和联系

    如果经常写python2,肯定会遇到各种“奇怪”的字符编码问题,每次都通过谷歌解决了,但是为什么会造成这种乱码.decode/encode失败等等,本文就字符和字符编码做一个总结,更加清晰区分诸多的编 ...

  10. 字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8

    原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享. 1.引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料. 这个问题比我想象 ...

随机推荐

  1. 带你认识大模型训练关键算法:分布式训练Allreduce算法

    摘要:现在的模型以及其参数愈加复杂,仅仅一两张的卡已经无法满足现如今训练规模的要求,分布式训练应运而生. 本文分享自华为云社区<分布式训练Allreduce算法>,原文作者:我抽签必中. ...

  2. CWE发布2021年最危险的25种软件缺陷

    摘要:CWE最危险的25种软件缺陷,是NVD过去两年中遇到的最常见和影响最大的问题指示性的列表. CWE Top25 可以帮助开发人员.测试人员和用户,以及项目经理.安全研究人员和教育工作者深入了解最 ...

  3. Scrum Master们,难道每天都在摸鱼?

    摘要:众所周知,Scrum Master是服务型领导--其本身不参与日常的研发工作,写代码.改Bug的工作都让团队干了,Scrum Master到底干了啥?Scrum Master工作的好坏应该如何衡 ...

  4. 破解数据匮乏现状:纵向联邦学习场景下的逻辑回归(LR)

    摘要:主要介绍了华为云可信智能计算服务(TICS)采用的纵向联邦逻辑回归(LR)方案. 本文分享自华为云社区<纵向联邦学习场景下的逻辑回归(LR)>,作者: 汽水要加冰. 海量训练数据是人 ...

  5. storybook组件属性详解:组件props到strorybook Args

    首先我们查看官方文档:https://storybook.js.org/docs/vue/writing-docs/doc-block-argstable#customizing 官方的例子么有看到v ...

  6. iOS应用程序发布流程:从测试到上架的完整指南

    ​ 目录 转载:iOS应用程序的签名.重签名和安装测试 前言 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 转载:iOS应用程序的签名.重签名和安装测试 前言 ipa ...

  7. socket.d.js v2.3.4 支持"微信"、"uniapp"

    Socket.D 是基于"事件"和"语义消息""流"的网络应用层协议.有用户说,"Socket.D 之于 Socket,尤如 Vu ...

  8. Jenkins Pipeline 多分支流水线 Input length = 1

    Jenkins 多分支流水线 构建过程中报错. [Pipeline] // node [Pipeline] End of Pipeline java.nio.charset.MalformedInpu ...

  9. Java 项目工程搭建 --创建子模块(依赖父工程)

    Java 项目工程搭建 --创建父工程 Java 项目工程搭建 --创建子模块(依赖父工程)   这个建方比较干净,不会生成乱七八糟的东西,(建完以后,其它模块可以 Copy 改名字) 选择 Mave ...

  10. 2012年第三届蓝桥杯【C++省赛B组】

    第一题:微生物增殖 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1 ...