项目要用到 Base64, 在网上找了好几个用着都者不是特别爽, 索性写一个.
项目地址
GitHub: cnwhy/Base64.js
安装
1 | npm i @cnwhy/base64 |
为何重复造轮子?
btoa
,atob
只支持Latin1
字符.Base64
编/解码本该与字符串无关, 但几乎所有 Base64 的decode
方法都输出字符串, 限制了使用场景.本库的
decode()
方法单纯将 Base64 字符串解析为Uint8Array
; 但重写了返回字节数组的toString()
方法, 默认以UTF-8
编码解析为字符串(类似nodejs
中buffer
对像的toString()
).++常用的的 Base64 编码库处理 javascript 字符串时会主动替换错误(空)编码字符, 导致解码的数据与原数据不一至.++
比如用nodejs
中的Buffer
:1
2
3
4var s = '\ud800'; //U+d800 属于代理区, 是一个空码, 如果从utf16来看,是一个4字节字符的一半.
var b64 = Buffer.from(s).toString('base64');
var _s = Buffer.from(b64, 'base64').toString();
console.log(s == _s); //false本库对于字符串的转换默认用
UTF-8
编码, 但无视无效符(解码按同一规则), 保证 js 的字符串(UCS-2)可以无损转换.- 其它 Base64 库 固定了 Base64 编码表, 与字符串的编码方式;
本库抽象出 Base64 算法, 支持自定义的 编码表 和 字符串编码方式, 适应更多特殊场景;
- 多数项目只需要
encode
或decode
, 而我又不想copy代码.本库有ES6风格模块文件, 利用
webpack
或rollup
可打出最简包.
兼容性
nodejs , 浏览器通用;
不支持
ArrayBuffer
的环境将会用Array
代替Uint8Array
.
demo
字符串 编码,解码
1 | import { encode, decode } from '@cnwhy/base64'; |
编码 Uint8Array ArrayBuffer
1 | import { encode, decode } from '@cnwhy/base64'; |
decode
函数始终Uint8Array
对像,不支持Uint8Array
的环境返回Array
自定义码表与字符串编码方式
1 | // 定义一个看起来乱码的 Base64 转换方法, 并且 字符串用 UTF16 编码; |
API
1 | Base64 = { |