如何将utf8格式读取的Zip文件内容转换为Buffer(JavaScript)
如何将UTF-8编码读取的Zip字符串还原为原始Buffer
当你用fs.readFile("test.zip", "utf8")读取Zip这类二进制文件时,本质是把原始二进制字节流强行按UTF-8规则解析成字符串。但Zip文件包含大量非UTF-8合法字节序列,Node.js会把这些无法解析的字节替换成�(U+FFFD),这部分数据已经永久丢失,无法完全还原回原始Buffer。
你的转换代码为什么无效
你写的转换函数逻辑错误:UTF-8是可变长编码,一个字符可能对应1-4个字节,直接用charCodeAt(i)取字符的Unicode编码当作单个字节写入Buffer,完全不符合UTF-8的编码规则,所以转换结果必然和原始Buffer不符。
正确的处理方案
最优方案:直接获取原始Buffer
如果能控制API的返回格式,让API直接返回原始二进制Buffer(等同于fs.readFile("test.zip")的结果),这是最可靠的方式,完全不会丢失数据。退而求其次:用Base64中转
如果API必须返回字符串,让它把原始Buffer转成Base64编码的字符串(buffer.toString('base64')),你收到后再用以下代码还原:const buf = Buffer.from(apiReturnedStr, 'base64');这种方式能完整恢复原始Buffer,不会丢失任何数据。
仅当只能拿到UTF-8字符串时的无奈处理
如果你只能拿到已经用UTF-8解析后的字符串,唯一能做的是用Node.js内置的UTF-8转Buffer方法:const buf = Buffer.from(apiReturnedStr, 'utf8');但必须明确:那些被替换成
�的字节无法恢复,转换后的Buffer和原始Zip文件的Buffer会有差异,大概率无法正常解压。
内容的提问来源于stack exchange,提问作者Sondge
相关产品推荐
相关产品推荐

