Js对字符串进行base64编码和解码,中文报错:Failed to execute ‘btoa‘ on ‘Window‘: The string to be encoded contains cha

我最早使用的是atob和btoa这两个函数,但是会出现报错。

直接使用封装好的方法:

/**
  * 编码base64
  */
function Encode64(str) {
  return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
    function toSolidBytes(match, p1) {
      return String.fromCharCode('0x' + p1);
    }));
}
/**
* 解码base64
*/
function Decode64(str) {
  return decodeURIComponent(atob(str).split('').map(function (c) {
    return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
  }).join(''));
}

btoa 和 atob 是window对象的两个函数,其中:

btoa :是binary to ascii,用于将binary的数据用ascii码表示,即Base64的编码过程
atob:是ascii to binary,用于将ascii码解析成binary数据,即Base64的解码过程。

binary to ascii,用于将ascii字符串二进制数据转换成一个base64编码过的字符串表示,即Base64的编码过程,常用于编码字符串

var str = "hello world";

var demo = btoa(str);

console.log(demo);// aGVsbG8gd29ybGQ=

btoa不能编辑Unicode字符 

var str = "好好学习";

var demo = btoa(str);

console.log(demo);

上面操作,此时会报错,翻译过来就是:无法在“Window”上执行“btoa”:要编码的字符串包含超出 Latin1 范围的字符 

4、Unicode字符编码
刚才上面的例子中我们想对Unicode字符编码进行编码,直接使用btoa不行的,所以我们使用encodeURIComponent和decodeURIComponent方法。

因为 btoa 仅支持 ASCII 字符序列,如所以我们要先使用 encodeURIComponent ,将中文字符编码转变成ASCII字符序列

编码时,先用encodeURIComponent对字符串进行编码,再用btoa进行Base64编码;
解码时,先用atob对Base64编码的串进行解码,再用decodeURIComponent对字符串进行解码

注意:

编码的过程:Unicode字符 -------> 先encodeURI -------> 再btoa编码
解码的过程:先atob解码 -------> 再decodeURI -------> Unicode字符
 

var str = "好好学习";

var demo = btoa(encodeURIComponent(str));

console.log(demo);//JUU1JUE1JUJEJUU1JUE1JUJEJUU1JUFEJUE2JUU0JUI5JUEw

var demo = 'JUU1JUE1JUJEJUU1JUE1JUJEJUU1JUFEJUE2JUU0JUI5JUEw'

var str1 = decodeURIComponent(atob(demo))

console.log(str1)//好好学习

 不过虽然到达了曲线救国的目的,但是由于 encodeURIComponent 和 decodeURIComponent 已经达到了转义控制字符的目的,使用 atob 和 btoa 感觉是多此一举。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024小神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值