为何Safari和Chrome调用atob解码该Base64字符串会出现报错?
报错原因
你使用的待解码字符串是URL安全Base64编码格式,与浏览器原生atob函数支持的标准Base64字符集不兼容,因此触发解码错误:
- 标准Base64字符集的特殊字符为
+、/,结尾用=作为填充符 - URL安全Base64为了适配URL传输场景,将
+替换为-、/替换为_,部分场景还会省略末尾的=填充
你的字符串中包含-字符,不属于atob认可的合法字符范围,所以会抛出编码错误。通用Base64解码工具通常会默认兼容两种编码格式,因此可以正常解析该字符串。
解决方案
先将URL安全Base64的特殊字符替换为标准Base64字符,再调用atob解码即可:
let a = "qNqrdXUrk5S7dCM1MAYH3qSVDXznb-6prQoGqiACR10="; // 替换URL安全特殊字符为标准Base64字符 const standardBase64 = a.replace(/-/g, '+').replace(/_/g, '/'); console.log(atob(standardBase64));
如果你的使用场景中会出现省略末尾=填充的URL安全Base64字符串,可以封装通用兼容方法:
function urlSafeAtob(base64Url) { // 替换特殊字符 let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); // 补全末尾填充符 const padCount = (4 - (base64.length % 4)) % 4; base64 += '='.repeat(padCount); return atob(base64); } // 测试使用 let a = "qNqrdXUrk5S7dCM1MAYH3qSVDXznb-6prQoGqiACR10="; console.log(urlSafeAtob(a));
内容的提问来源于stack exchange,提问作者Steve Owens
相关产品推荐
相关产品推荐

