javascript - 为什么 atob 在这个 Base 64 字符串上的 Safari 和 Chrome 中失败?
问题描述
这是重现该问题的 Javascript 示例:
let a = "qNqrdXUrk5S7dCM1MAYH3qSVDXznb-6prQoGqiACR10=";
console.log(atob(a));
在 Safari 中,我们得到:
无效字符错误:字符串包含无效字符。
在 Chrome 中,我们得到:
未捕获的 DOMException:无法在 'Window' 上执行 'atob':要解码的字符串未正确编码。
我可以在 base64decode.org 上解码上述字符串。顺便说一下,这个值是一个随机的字节序列,而不是任何人类可读的字符串。atob 应该处理这个问题。
解决方案
从同一页面的“设计”部分:
MIME 的 Base64 实现对前 62 个值使用 AZ、az 和 0-9,以及对后两个值使用“+”和“/”。其他变体,通常源自 Base64,共享此属性,但在为最后两个值选择的符号上有所不同;一个例子是 URL 和文件名安全的“RFC 4648 / Base64URL”变体,它使用“-”和“_”。
JS 使用基于 MIME 的编码,因此-
初始字符串中的 无效。通过检测输入字符串中的字符并选择正确的解码格式而不是盲目使用atob()
.
推荐阅读
- python - 从 pandas DataFrame 的集合中提取所有元素
- typescript - 在 Typescript 中,有没有办法检查对象或函数是否在“import * as myImport”语句中导入?
- java - 如何在 Java 中隐藏输入并将其转换为星号
- typescript - 如何将 NextJS 构建到 es5?
- r - 在ggplot中的多面板图上聚集了x轴刻度
- python-3.x - 如何在 Django 的应用程序之间获取外键值?
- javascript - 在一页上加载多个 vue 实例后,其中一个实例不起作用
- r - 多变量分布错误:sigma' 不是正定的
- excel - 如何在 vlookup 不起作用的 excel 范围内拉出最近的字符串?
- flutter - Flutter 在播放前缓存视频在 Futurebuild 上为空