ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

小程序不支持TextDecoder

2022-04-24 18:02:06  阅读:313  来源: 互联网

标签:temp encoding TextDecoder 程序 支持 buffer 0x80 && var


  前段时间在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;
    }

标签:temp,encoding,TextDecoder,程序,支持,buffer,0x80,&&,var
来源: https://www.cnblogs.com/uncleguo/p/16186906.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有