请教一下,node.js在把zip压缩包读出来后再保存还原为zip压缩包时,读时因不同编码而结果有所差异,请问如何解决?(有代码)
发布于 5 天前 作者 wldlzt 323 次浏览 来自 问答

简单来说一个正常可以解压的test.zip,如果用binary来读,如下: var zipBinary = fs.readFileSync(“1234.zip”, ‘binary’); 此时,用读出来的zipBinary重新保存成2345.zip fs.writeFileSync(‘2345.zip’,zipBinary,‘binary’); 那2345zip是可以正常解压,但是,如果用utf-8来读 var zipUtf8 = fs.readFileSync(“1234.zip”, ‘utf-8’); 之后再保存 fs.writeFileSync(‘2345.zip’,zipUtf8,‘utf-8’); 那此时这个2345.zip是损坏而无法解压,我也试过把zipUtf8转成binary var zipUtf8ToBinary=Buffer.from(zipUtf8,‘binary’); 再进行保存 fs.writeFileSync(‘2345.zip’,zipUtf8ToBinary,‘binary’); 结果2345.zip同样是损坏的。 问题就是,如何用utf-8读压缩包出来的字符串仍然能还原为正常可解压的zip文件?

6 回复

这个问题在某些业务场景下,如缓存zip到内存或是zip在网络间的简单传输都有一定的意义,如有了解的朋友请指点一二,谢谢谢谢~~~

首先,二进制内容转换为 UTF-8 编码的时候,有些内容不是合法的 UTF-8字符,所以转换过程会丢失,然后再转回去二进制肯定就不一样了,所以稳妥的方法就是通过原始的编码方式来传输。 如果想通过文本方式传输二进制的内容,可以试试诸如 Base64 这样的编码方式,例如:

const s = fs.readFileSync("file1.zip", "base64");
// "hello, world" 会转换为 "aGVsbG8sIHdvcmxk"
fs.writeFileSync("file2.zip", s, "base64");

@leizongmin 谢谢谢谢~~~其实我就是在折腾。。。就是看怎么把utf-8转回去…真心想了解这一方面的知识…

有朋友了解过吗~~~

有没朋友可以指点一下…

二楼说得很清楚了:utf8有它自己编码规则,不符合规则的二进制内容强转utf-8,内容就会丢失。

回到顶部