为什么重复造轮子?
-
btoa
, atob
只支持 Latin1
字符.
-
常用的的 Base64 编码库处理字符串时会主动修改错误(空)编码字符, 导致解码的数据与原数据不一至.
比如用 nodejs 中的 Buffer
:
var s = '\ud800';
var b64 = Buffer.from(s).toString('base64');
var _s = Buffer.from(b64, 'base64').toString();
e;
-
Base64
编/解码本该与字符串无关, 但几乎所有 Base64 的decode
方法都输出字符串,限制了使用场景.
本库方案
对于字符串的转换用UTF-8
编码, 但无视无效符(解码按同一规则), 保证 js 的字符(UCS-2)串可以无损转换.
decode()
单纯将Base64
解析Byte[]
; 但重写返回字节数组的toString()
方法, 以UTF-8
编码解析为字符串.
适用场景
- 二进制数据与 Base64 互转
- 字符串与 Base64 互转
Demo
const Base64 = require('base64.js');
let str = 'Base64库\u{10400}\u{d800}';
console.log(str);
console.log('==Base64.js==')
let b64 = Base64.encode(str);
let _str = Base64.decode(b64).toString();
console.log(b64);
console.log(str === _str)
console.log('==Buffer==')
let bf_b64 = Buffer.from(str).toString('base64');
let bf_str = Buffer.from(bf_b64,'base64').toString();
console.log(bf_b64);
console.log(str === bf_str);
兼容性
通用, 不支持ArrayBuffer
的环境将会用Array
代替Uint8Array
.
API
Base64 = {
encode(input:string|ArrayBuffer|Uint8Array|number[]):string;
decode(input:string|ArrayBuffer|Uint8Array|number[]):Uint8Array;
encodeURL(input:string|ArrayBuffer|Uint8Array|number[]):string;
decodeURL(input:string|ArrayBuffer|Uint8Array|number[]):Uint8Array;
utf8Encode(str:string):Uint8Array;
utf8Decode(utf8arr:Uint8Array):string;
lib:{
getEncode(table: string[], pad: string): encode;
getDecode(table: string[], pad: string): decode;
}
}