JavaScript atob 与 Notepad++ Base64 解码不同

Posted

技术标签:

【中文标题】JavaScript atob 与 Notepad++ Base64 解码不同【英文标题】:JavaScript atob is different than Notepad++ Base64 Decode 【发布时间】:2020-01-24 05:29:42 【问题描述】:

我正在接收作为 Base64 编码字符串的 zip 文件的内容(来自 API)。

如果我将该字符串粘贴到 Notepad++ 中并转到

插件 > MIME 工具 > Base64 解码

并将其保存为test.zip,它成为一个有效的zip文件,我可以打开它。

现在,我正在尝试在 JavaScript 中实现相同的目标。

我已经尝试过atob(),可能还有the answers here 和the code from Mozilla doc 中提到的所有内容。

atob 产生类似的内容,但某些字符的解码方式不同(因此成为无效的 zip 文件)。其他方法抛出无效的 URI 错误。

如何在 javascript 中重现 Notepad++ 行为?

【问题讨论】:

如何将atob() 的输出转换为文件? @Phil 这是我用来保存文件的:***.com/questions/13405129/… 【参考方案1】:

window.atob 仅适用于解码适合 UTF-8 字符串的数据。任何无法以 UTF-8 字符串表示的内容在解码时都将不等于其二进制形式。 Javascript 最多会尝试将结果字节编码为 UTF-8 字符序列。这就是您的 zip 存档最终无效的原因。

您执行以下操作的那一刻:

var data = window.atob(encoded_data)

...您在 UTF-8 字符串中使用不同的数据表示形式,该字符串由变量 data 引用。

您应该将二进制数据直接解码为ArrayBuffer。而window.atob 不适合这个。

Here 是一个可以将 base64 编码数据直接转换为ArrayBuffer 的函数。

【讨论】:

太棒了!我花了一整天的时间寻找这个,非常感谢!

以上是关于JavaScript atob 与 Notepad++ Base64 解码不同的主要内容,如果未能解决你的问题,请参考以下文章

javascript使用btoa和atob来进行Base64转码和解码

使用Javascript的atob解码base64不能正确解码utf-8字符串

javascript 使用btoa和atob来进行Base64转码和解码

javascript 使用btoa和atob来进行Base64转码和解码

window.btoa 与 window.atob

js base64的转码与解码