首页 > 解决方案 > 为什么 atob 在这个 Base 64 字符串上的 Safari 和 Chrome 中失败?

问题描述

这是重现该问题的 Javascript 示例:

let a = "qNqrdXUrk5S7dCM1MAYH3qSVDXznb-6prQoGqiACR10=";
console.log(atob(a));

在 Safari 中,我们得到:

无效字符错误:字符串包含无效字符。

在 Chrome 中,我们得到:

未捕获的 DOMException:无法在 'Window' 上执行 'atob':要解码的字符串未正确编码。

我可以在 base64decode.org 上解码上述字符串。顺便说一下,这个值是一个随机的字节序列,而不是任何人类可读的字符串。atob 应该处理这个问题。

标签: javascript

解决方案


从同一页面的“设计”部分:

MIME 的 Base64 实现对前 62 个值使用 AZ、az 和 0-9,以及对后两个值使用“+”和“/”。其他变体,通常源自 Base64,共享此属性,但在为最后两个值选择的符号上有所不同;一个例子是 URL 和文件名安全的“RFC 4648 / Base64URL”变体,它使用“-”和“_”。

JS 使用基于 MIME 的编码,因此-初始字符串中的 无效。通过检测输入字符串中的字符并选择正确的解码格式而不是盲目使用atob().


推荐阅读