pako.js的gzip inflate函数异常问题求助
解决ZLIB解压乱码问题
你的代码存在两个关键错误,导致解压后出现乱码:
错误1:使用
Uint16Array存储字节数据atob解码后的字符串每个字符对应1个8位字节,用Uint16Array会将两个8位字节合并成一个16位数值,直接破坏ZLIB压缩数据的原始结构。应该用Uint8Array存储8位字节数据。错误2:重复解码字符串
pako.inflate(binData, {to: "string"})已经将解压后的字节数组直接转换成UTF-8字符串,后续再用TextDecoder解码这个字符串,相当于把字符串当成字节数据重新解码,必然导致乱码。
修正后的代码如下:
const compressedData = "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"; // 解码base64字符串 const strData = atob(compressedData); // 将字符串转换为8位字节数组 const charData = strData.split('').map(x => x.charCodeAt(0)); const binData = new Uint8Array(charData); // 使用pako解压并直接转为字符串 const result = pako.inflate(binData, { to: "string" }); console.log(result);
修正后,你会得到完整且无乱码的解压结果,原本乱码的部分会被正确解析,保留所有格式和内容。
内容的提问来源于stack exchange,提问作者Ren
相关产品推荐
相关产品推荐

