atob解码utf-8字符

使用场景:后台传来经过base64编码的字符串(含有中文), 需要在前端进行解码。

代码一:

1
2
3
getUserName: (str) => {
return decodeURIComponent(atob(str))
},

bug:中文解码后,出现乱码。
原因:js中的atob函数(拉丁字符集)不支持unicode字符集。

解决:

1
2
3
getUserName: (str) => {
return decodeURIComponent(escape(atob(str)));
},

  • 使用escape对拉丁字符串进行编码,将拉丁字符集翻译成对应的十六进制符号;
  • 使用decodeURIComponent(utf-8字符集)解析,把十六进制符号翻译成utf-8字符集中对应的字符!
1
2
3
4
5
6
7
8
// 使用utf-8字符集进行base64编码
function utoa(str) {
return btoa(unescape(encodeURIComponent(str)));
}
// 使用utf-8字符集解码base64字符串
function atou(str) {
return decodeURIComponent(escape(atob(str)));
}