![](/img/trans.png)
[英]Using Javascript's atob to decode base64 doesn't properly decode utf-8 strings
[英]JavaScript atob is different than Notepad++ Base64 Decode
我收到 zip 文件(来自 API)的内容作为 Base64 编码的字符串。
如果我将该字符串粘贴到 Notepad++ 和 go
插件 > MIME 工具 > Base64 解码
并将其保存为test.zip
,它成为一个有效的 zip 文件,我可以打开它。
现在,我试图在 JavaScript中实现同样的目标。
我已经尝试过atob()
,可能这里的答案中提到的所有内容以及来自 Mozilla doc 的代码。
atob
产生类似的内容,但某些字符的解码方式不同(因此成为无效的 zip 文件)。 其他方法会引发无效的 URI 错误。
如何在 JavaScript 中重现 Notepad++ 行为?
window.atob
仅适用于解码适合 UTF-8 字符串的数据。 任何无法在 UTF-8 字符串中表示的内容在解码时都将不等于其二进制形式。 Javascript 最多会尝试将结果字节编码为 UTF-8 字符序列。 这就是您的 zip 存档最终无效的原因。
当您执行以下操作时:
var data = window.atob(encoded_data)
...您在变量data
引用的 UTF-8 字符串中有不同的数据表示形式。
您应该将二进制数据直接解码为ArrayBuffer
。 而window.atob
不适合这个。
这是一个 function ,它可以将 base64 编码数据直接转换为ArrayBuffer
。
如前所述,不要直接使用 atob 解码 Base64 编码的 zip 文件。 您可以改用https://stackoverflow.com/a/21797381/3508516中提到的这个 function。
function _base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.