const atob = (encodedString) => Buffer.from(encodedString, 'base64').toString('latin1')
是否有可以在nodejs和浏览器中正常使用的API,可以帮助我将base64转换为utf8字符串?
在node.js中,我们可以写:
const base64ToUtf8 = (encodedString) => Buffer.from(encodedString, 'base64').toString('utf8')
我需要使用此功能在node.js和浏览器中处理base64编码的utf8数据-uri。
此node-js代码读取以base64字符串“ as UTF-8”]编码的数据。请注意,这与将“转换为UTF-8字符串”不同,因为JavaScript仅支持UCS-2和UTF-16字符串。
此nitpick通过了,在浏览器中有许多方法可以执行与此代码相同的操作。
最干净的方法是首先在ArrayBuffer中解码此base64字符串,然后将该ArrayBuffer读取为字符串,就像您的节点代码一样:
const b64 = "wqFIb2xhIG5pw7FvcyE=";
const buf = base64ToBuf(b64);
const txt = new TextDecoder().decode(buf);
console.log(txt);
function base64ToBuf(str) {
const binStr = atob(str);
const len = binStr.length;
const arr = new Uint8Array(len);
for (let i = 0; i < len; i++) {
arr[i] = binStr.charCodeAt(i);
}
return arr;
}
另一种,代码较短,但暗示着更多的IO是将其fetch作为文本:
const b64 = "wqFIb2xhIG5pw7FvcyE=";
fetch('data:text;base64,' + b64)
.then(r => r.text())
.then(txt => console.log(txt));
而且您还可以使用FileReader API的readAsText()
,如果您想支持比utf-8更多的编码,这可能很有用。
readAsText()
还有一个新的const b64 = "wqFIb2xhIG5pw7FvcyE=";
const blob = base64ToBlob(b64);
const reader = new FileReader();
reader.onload = e => {
const txt = reader.result;
console.log(txt);
};
reader.readAsText(blob, "utf8");
function base64ToBlob(str) {
const binStr = atob(str);
const len = binStr.length;
const arr = new Uint8Array(len);
for (let i = 0; i < len; i++) {
arr[i] = binStr.charCodeAt(i);
}
return new Blob([arr]);
}
可以直接转换为utf-8,但是从base64字符串开始,对这条路的兴趣不大。仍然出于好奇: