// 将十六进制字符串转中文: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
}
可以替换为https://github.com/inexorabletash/text-encoding
const TextEncoderLib = require('./lib/encoding.js'); new TextEncoderLib.TextEncoder(); new TextEncoderLib.TextDecoder();
const TextEncoderLib = require('./lib/encoding.js');
const decoder = new TextEncoderLib.TextDecoder('utf-8')
newData = decoder.decode(response.data)
不知道为什么用上面网友给的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'
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)
}
小程序不支持 TextEncoder / TextDecoder 。
请参考 MDN ,考虑使用 polyfill 。
我也分享一下遇到的坑,TextDecoder浏览器自带的API,在微信开发者工具中可以使用,在真机小程序环境没有这个方法,所以会报错的。然后找替代的
String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)); //在真机上会遇到个溢出报错,乱码的问题好像也有 text-encoding-shim 这个库,在微信开发者工具中表现正常,安卓手机部分表现正常,iOS手机基本会遇到问题。而且好像有乱码的情况 fastestsmallesttextencoderdecoder 方法错误 text-encoding-utf-8 真机OK,微信开发者工具失败
请问后面怎么解决了 我也遇到这个问题 导入了require("encoding-indexes.js");require("encoding.js");依旧不可以;
开发者工具可以,但是真机预览不可以
https://github.com/anonyco/FastestSmallestTextEncoderDecoder
https://github.com/anonyco/FastestSmallestTextEncoderDecoder/blob/master/EncoderDecoderTogether.min.js
把CDN资源下载下来,小程序里直接require()引入,全局就有TextEncoder / TextDecoder 了。
// app.js
reuiqre('path/to/EncoderDecoderTogether.min.js')
记得 需要npm构建