简单实现多字节base64编码

本文探讨了在浏览器环境中如何处理不支持多字节编码的限制,介绍了使用encodeURIComponent、unescape和自定义函数实现B64编码与解码的方法,同时提到了对废弃函数的替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于浏览器内置的函数:btoa不支持多字节编码:

btoa("一")

执行会报错:Uncaught DOMException: Failed to execute 'btoa' on 'Window':
The string to be encoded contains characters outside of the Latin1 range.

mdn上给出的一种编码方案是:

window.btoa(unescape(encodeURIComponent('一'))) // 5LiA

然后反过来操作就是解码:

decodeURIComponent(escape(window.atob(str))) // 一

原理其实很简单:得到多字节字符的utf-8编码,然后每个字节转成ascii字符,然后再用btoa进行编码。

但是,escapeunescape都属于被废弃的函数,我们可以通过简单的转换来实现同样的功能:

function b64encode(str){
    // 得到utf-8编码
    const utf8 = encodeURIComponent(str)
    // %xx对应的每字节转换成字符串
    const utf8Str = utf8.replace(/%(\w{2})/g,(m,a)=>String.fromCharCode('0x' + a))
    return btoa(utf8Str)
}

function b64decode(str){
    // 每个字节处理成%xx形式
    const utf8 = [...atob(str)].map(item => '%' + item.charCodeAt(0).toString(16)).join('')
    // 解码utf8
    return decodeURIComponent(utf8)
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值