收藏
回答

微信小程序不支持TextDecoder

框架类型 问题类型 终端类型 微信版本 基础库版本
小程序 Bug 微信iOS客户端 6.5.3 2.25.0
// 将十六进制字符串转中文:hex为十六进制字符串 encoding为编码格式,默认是utf-8
export function hexToStr(hex,encoding) {
  // 去掉字符串首尾空格
  let trimedStr = hex.trim()
  // 判断trimedStr前两个字符是否为0x,如果是则截取从第三个字符及后面所有,否则返回全部字符
  let rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr
  // 得到rawStr的长度
  let len = rawStr.length
  // 如果长度不能被2整除,那么传入的十六进制值有误,返回空字符
  if (len % 2 !== 0) {
    return ""
  }
  let curCharCode // 接收每次循环得到的字符
  let resultStr = [] // 存转换后的十进制值数组
  for (let i = 0; i < len; i = i + 2) {
    curCharCode = parseInt(rawStr.substr(i, 2), 16)
    resultStr.push(curCharCode)
  }
  // encoding为空时默认为utf-8
  let bytesView = new Uint8Array(resultStr) // 8 位无符号整数值的类型化数组
  // TextEncoder和TextDecoder对字符串和字节流互转  
  let str = new TextDecoder(encoding).decode(bytesView)
  return str
}
回答关注问题邀请回答
收藏

7 个回答

  • Xiong
    Xiong
    2024-05-11

    不知道为什么用上面网友给的FastestSmallestTextEncoderDecoder这个一直引入不到里面的方法,

    找网友要了两个js包就可以了,

    https://github.com/123456789xzxz/miniprogram/blob/main/miniprogram-text-decoder.js

    https://github.com/123456789xzxz/miniprogram/blob/main/miniprogram-text-encoder.js

    然后按需要引入就行

    import TextDecoder from './miniprogram-text-decoder'

    import TextEncoder from './miniprogram-text-encoder'


    2024-05-11
    有用 3
    回复 3
    • 小郭
      小郭
      2024-06-06
      文件下载地址:
      https://github.com/123456789xzxz/miniprogram/blob/main/miniprogram-text-decoder.js
      https://github.com/123456789xzxz/miniprogram/blob/main/miniprogram-text-encoder.js
      文件下载来后,引入小程序:
      import TextDecoder from '@/utils/miniprogram-text-decoder'
      使用方式:
      let tempUint8Array = new Uint8Array(0)
      const requestTask = wx.request({
          url: baseURL,
          timeout: 15000,
          method: ’post‘,
          enableChunked: true, // 开启分片模式
          header: { },
          data: param
      })
      requestTask.onChunkReceived((response) => {
          const arrayBuffer = new Uint8Array(response.data)
          let str = new TextDecoder().decode(arrayBuffer)
          console.log('deMessage', str)
      }
      2024-06-06
      1
      回复
    • Lizer
      Lizer
      2024-07-22
      static_utils_decode.TextDecoder is not a constructor
      2024-07-22
      回复
    • Lizer
      Lizer
      2024-07-22
      vue3 vite 就失效了
      2024-07-22
      回复
  • 金色麦浪
    金色麦浪
    2024-06-25

    可以替换为https://github.com/inexorabletash/text-encoding

    const TextEncoderLib = require('./lib/encoding.js');
    new TextEncoderLib.TextEncoder();
    new TextEncoderLib.TextDecoder();
    


    2024-06-25
    有用 2
    回复 4
    • 阿777
      阿777
      2024-08-15
      感谢,用上了!
      2024-08-15
      回复
    • 010_from_earth
      010_from_earth
      2024-10-10
      2024-10-10
      回复
    • 向阳而生
      向阳而生
      2024-10-28
      但是小程序超包了,怎么办?
      2024-10-28
      回复
    • 向阳而生
      向阳而生
      2024-10-28
      encoding-indexes.js 大于500K了
      2024-10-28
      回复
  • 呆jio不
    呆jio不
    2024-06-05

    我也分享一下遇到的坑,TextDecoder浏览器自带的API,在微信开发者工具中可以使用,在真机小程序环境没有这个方法,所以会报错的。然后找替代的

    String.fromCharCode.apply(nullnew Uint8Array(arrayBuffer)); //在真机上会遇到个溢出报错,乱码的问题好像也有
    
    text-encoding-shim 这个库,在微信开发者工具中表现正常,安卓手机部分表现正常,iOS手机基本会遇到问题。而且好像有乱码的情况
    
    fastestsmallesttextencoderdecoder 方法错误
    text-encoding-utf-8 真机OK,微信开发者工具失败
    
    
    2024-06-05
    有用 1
    回复
  • momo
    momo
    2022-07-21

    小程序不支持 TextEncoder / TextDecoder 。

    请参考 MDN ,考虑使用 polyfill 。

    2022-07-21
    有用 1
    回复 1
    • ConstancyMan
      ConstancyMan
      2022-07-21
      能具体点吗,有没有代码段啊
      2022-07-21
      回复
  • Atianคิดถึง
    Atianคิดถึง
    03-06
    function textDecode(data:any){
        let txt;
        // 进行判断返回的对象是Uint8Array(开发者工具)或者ArrayBuffer(真机)
        // 1.获取对象的准确的类型
        const type = Object.prototype.toString.call(data); // Uni8Array的原型对象被更改了所以使用字符串的信息进行判断。
        if(type ==="[object Uint8Array]"){
            //console.log("Uint8Array");
            txt=decodeURIComponent(escape(String.fromCharCode(...data)))
        }else if(data instanceof ArrayBuffer){
            // 将ArrayBuffer转换为Uint8Array
            //console.log("ArrayBuffer");
            const uint8Array = new Uint8Array(data);
            txt=decodeURIComponent(escape(String.fromCharCode(...uint8Array)))
        }
        return txt;
      }
    直接使用方法 const chunkText = textDecode(res.data);
    
    03-06
    有用
    回复
  • 王妙端
    王妙端
    2023-03-30

    请问后面怎么解决了 我也遇到这个问题 导入了require("encoding-indexes.js");require("encoding.js");依旧不可以;

    开发者工具可以,但是真机预览不可以


    2023-03-30
    有用
    回复 1
  • 举高高
    举高高
    2022-07-21

    https://github.com/anonyco/FastestSmallestTextEncoderDecoder

    https://github.com/anonyco/FastestSmallestTextEncoderDecoder/blob/master/EncoderDecoderTogether.min.js

    把CDN资源下载下来,小程序里直接require()引入,全局就有TextEncoder / TextDecoder 了。

    2022-07-21
    有用
    回复 7
    查看更多(2)
登录 后发表内容