前段时间在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. Go 1.18 新特性:多模块工作区模式

    摘要:在 Go 1.18 推出多模块工作区模式--Multi-Module Workspaces,用以支持模块的多个工作空间,我们来看看到底有什么特别. 本文分享自华为云社区<一起看看 Go 1 ...

  2. Redis现网那些坑:用个缓存,还要为磁盘故障买单?

    摘要:向业务查询超时say goodbye! 本文分享自华为云社区<Redis现网那些坑:用个缓存,还要为磁盘故障买单?>,作者: GaussDB 数据库 . 近日,网上一些电商用户出现了 ...

  3. APP安全加固怎么做?加固技术、加固方法、加固方案

    ​ 前面的文章中我们为大家介绍了移动应用安全检测的测试依据.测试方法.和测试内容,本文我们着重分享App安全加固的相关内容. ​ (安全检测内容) 通过前面的文章我们知道了app安全检测要去检测哪些内 ...

  4. AcWing 每日一题 - 暑假

    本篇解题记录题源来自 AcWing 的每日一题 · 暑假 补题链接:Here Week 1 星期四 AcWing 3761. 唯一最小数 利用 map 存出现过数的下标和次数即可 vector< ...

  5. Codeforces #698 Div.2 (A~D题)个人题解记录

    1478A. Nezzar and Colorful Balls 看半天题,然后才发现是统计最大值. int _; int main() { ios_base::sync_with_stdio(fal ...

  6. list求交集、并集、差集等//post或者get请求方法

    package com.siebel.api.server.config.rest; import com.google.common.base.Joiner; import com.google.c ...

  7. vue学习笔记 一、环境搭建

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  8. h5响应式方案设计

  9. Liunx运维(二)-文件与目录操作

    文档目录: 一.pwd:显示当前位置 二.cd:切换目录 三.tree:树形结构显示目录 四.mkdir 创建目录 五.touch:创建空文件或改变文件时间戳 六.ls:显示目录下内容相关属性信息 七 ...

  10. mysql之力扣数据库题目620有趣的电影优化记录

    闲着没事儿刷刷力扣的数据库题目,题目编号620:有趣的电影,下面是题目描述: 优化前的sql及执行时间: 优化后的sql及执行时间: 这里对筛选条件进行了优化: 1.select * 的查找效率要比逐 ...