Base64的编码与解码

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

文档

data URIs
data URIs, 定义于RFC 2397,用于在文档内嵌入小的文件。
Base64
维基百科上关于Base64的文章。
atob()
解码一个Base64字符串。
btoa()
从一个字符串或者二进制数据编码一个Base64字符串。
"Unicode 问题"
在大多数浏览器里里,在一个Unicode字符串上调用btoa()会造成一个Character Out Of Range异常。这一段写了一些解决方案。
URIScheme
Mozilla支持的URI schemes列表。
StringView
这篇文章发布了一个我们做的库,目的在于:
  • 为字符串创建一个类C接口 (i.e. array of characters codes — ArrayBufferView in JavaScript) ,基于JavaScript ArrayBuffer 接口。
  • 为类字符串对象(目前为止为: stringViews) 创建一系列方法,它们严格按照数字数组工作,而不是不可变的字符串。
  • 可用于其它Unicode编码,和默认的 DOMStrings不同。

查看所有...

工具

View All...

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.

See also

文档标签和贡献者

 此页面的贡献者: luojia, fghpdf, ahcheqiu
 最后编辑者: luojia,