常规方法:
编码
// base64转字符串 getEncode64(str){ // 对字符串进行编码 var encode = encodeURI(str); // 对编码的字符串转化base64 var base64 = btoa(encode); return base64; },
解码:
// base64转字符串 getDecode(str){ // 对base64转编码 var decode = atob(base64); // 编码转字符串 var str = decodeURI(decode); return str; },
使用方法:
let url = 'http://百度.com' //转base64编码 let base64Url = this.getEncode64(url); //解码 后台返回JSON格式所以加了JSON.parse进行json解码,正常对象格式就不用加 let data =JSON.parse(this.getDecode(resp.data)); console.log(data);
问题:
用上述的编码和解码,自己前端操作编译和解码中文都是没有问题的,但是由于需要后台,编码后传输到后台,后台返回编码格式再解码的时候就会出现中文乱码。
原因:
一番查找下来,可能是由于 常规的encode方法虽然界面上转的是utf-8,但是实际上传输存储的时候格式还是utf-16,后台返回的是utf-8格式,用decode界面实际上转的是utf-16,转utf-8会出现中文乱码。也就是说上述的编码和解码,适用于页面本身编码解码,不适合传输用。
解决解码中文乱码:
//字符串转base64 getEncode64(str){ return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) { return String.fromCharCode('0x' + p1); })); }, getDecode(str){ return decodeURIComponent(atob(str).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); },
用这两个编码和解码就正常了,encodeURIComponent是转utf-8