当前位置:   article > 正文

解决微信小程序不支持TextEncoder/TextDecoder对象

textencoder

问题描述:在使用小程序开发者工具开发小程序中使用到了CRC算法,其中有一行代码使用到了TextEncoder对象,在开发工具中一切正常,到手机上会报出错误错误如下:
MiniProgramError
TextEncoder is not defined
ReferenceError: TextEncoder is not defined

解决办法:

// 报错代码
const encoder = new TextEncoder("utf-8");
const data = encoder.encode(inputString);
  • 1
  • 2
  • 3

方法一:使用兼容写法

//TextEncoder
unescape(encodeURIComponent(inputString)).split("").map(val => val.charCodeAt());
//TextDecoder
decodeURIComponent(escape(String.fromCharCode(...['需解码的内容替换'])));
  • 1
  • 2
  • 3
  • 4

方法二:引入库

GitHub地址-EncoderDecoderTogether.min.js

小程序里直接require()引入,全局就有TextEncoder / TextDecoder 了。

// app.js
require('path/to/EncoderDecoderTogether.min.js')
  • 1
  • 2

或者使用NPM安装,安装方式见文档

GitHUb地址-FastestSmallestTextEncoderDecoder

这个库只支持utf-8编码,其他编码的话可以看看这个

Github地址-text-encoding

最后附上CRC-16代码

function calculateCRC16(inputString) {
  // 将输入字符串编码为字节数组(使用UTF-8编码)
  const data = unescape(encodeURIComponent(inputString))
    .split("")
    .map((val) => val.charCodeAt());

  let crc = 0xffff;
  for (let i = 0; i < data.length; i++) {
    crc ^= data[i] & 0xff;
    for (let j = 0; j < 8; j++) {
      if (crc & 0x0001) {
        crc = (crc >> 1) ^ 0x8006; // 使用 CRC-16 CCITT 多项式
      } else {
        crc = crc >> 1;
      }
    }
  }

  // 将 CRC-16 校验值格式化为十六进制字符串
  let crc16Hex = crc.toString(16).toUpperCase();

  // 如果 CRC-16 校验值长度不足 4 位,前面补零
  while (crc16Hex.length < 4) {
    crc16Hex = "0" + crc16Hex;
  }

  return crc16Hex;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/497893
推荐阅读
相关标签
  

闽ICP备14008679号