Base64是一组相似的二进制到文本(binary-to-text)的编码规则,使得二进制数据在解释成radix-64的表现形式后能够用ASCII字符串的格式表示出来。Base64 这个词出自一种MIME数据传输编码。
Base64编码普遍应用于需要通过被设计为处理文本数据的媒介上储存和传输二进制数据而需要编码该二进制数据的场景。这样是为了保证数据的完整并且不用在传输过程中修改这些数据。Base64也被一些应用(包括使用MIME的电子邮件)和在XML中储存复杂的数据时使用。
在JavaScript中,有2个函数分别用来处理解码和编码base64 字符串:
atob()
函数能够解码通过base-64编码的字符串数据。相反地,btoa()
函数能够从二进制数据“字符串”创建一个base-64编码的ASCII字符串。
atob()
和 btoa()
均使用字符串。如果你想使用ArrayBuffers,
请参阅this paragraph。
文档节
维基百科上关于Base64的文章。 解码一个Base64字符串。 从一个字符串或者二进制数据编码一个Base64字符串。 在大多数浏览器里里,在一个Unicode字符串上调用btoa()会造成一个 Mozilla支持的URI schemes列表。 这篇文章发布了一个我们做的库,目的在于:
| 工具节
相关文章节 |
Unicode问题节
由于 DOMString
是16位编码的字符串,所以如果有字符超出了8位ASCII编码的字符范围时,在大多数的浏览器中对Unicode字符串调用 window.btoa
将会造成一个 Character Out Of Range
的异常。有2种方法解决这个问题:
- 第一个是转义(escape)整个字符串然后编码这个它;
- 第二个是把UTF-16的
DOMString
转码为UTF-8的字符数组然后编码它。
下面是2个可行的方法。
方案 #1 – 编码之前转义(escape)字符串节
function b64EncodeUnicode(str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
b64EncodeUnicode('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="
把base64转换回字符串
function b64DecodeUnicode(str) {
return decodeURIComponent(atob(str).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
}
b64DecodeUnicode('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"
b64DecodeUnicode('Cg=='); // "\n"
Unibabel 是一个包含了一些使用这种策略的通用转换的库。
方案 #2 – 用JavaScript的 TypedArray
和 UTF-8重写DOM的 atob()
和 btoa()
节
使用像TextEncoding(包含了早期(legacy)的windows,mac, 和 ISO 编码),TextEncoderLite 或者 Buffer 这样的文本编码器增强(polyfill)和Base64增强,比如base64-js。
最简单,最轻量级的解决方法就是使用 TextEncoderLite 和 base64-js.
想找更完整的库,参见 StringView
– a C-like representation of strings based on typed arrays.