如何从Javascript中的Base64编码字符串中获取UTF8编码字符串?

How to get a UTF8 encoded string from a Base64 encoded string in Javascript?

AEEAQgBDAGEAYgBjABCabc 的 Base64 但是当我 运行 这段代码时:

let a = Buffer.from('AEEAQgBDAGEAYgBj', 'base64').toString('utf-8');
console.log(Buffer.from(a, 'utf8'));

控制台打印的结果是<Buffer 00 41 00 42 00 43 00 61 00 62 00 63>,是UTF16 (LE)。

我假设因为我是从 UTF8 编码字符串创建缓冲区,所以结果将是 <Buffer 41 42 43 61 62 63>。 那么如何从 Base64 获取实际的 UTF8 编码字符串呢?

问题是你的原始数据是Base64编码的UTF16-BE。如果您在第一行之后查看 a,您会发现它具有您在最终缓冲区中看到的那些零字节:

let a = Buffer.from("AEEAQgBDAGEAYgBj", "base64").toString("utf-8");
console.log(a.length);
// 12
console.log([...a].map(ch => ch.charCodeAt(0).toString(16).padStart(2, "0")).join(" "));
// 00 41 00 42 00 43 00 61 00 62 00 63

所以问题变成了:如何从 Buffer.from("AEEAQgBDAGEAYgBj", "base64") 读取缓冲区中的 UTF16-BE 文本。 Node.js的Buffer不直接支持UTF16-BE(其标准库中没有"utf16be"编码),但你可以通过swap16到达那里然后阅读缓冲区为 UTF16-LE("utf16le",在 Node.js 的标准库中

let a = Buffer.from("AEEAQgBDAGEAYgBj", "base64").swap16().toString("utf16le");
console.log(a.length);
// 6
console.log(a);
// ABCabc

现在 a 是一个普通的字符串。如果你想要一个包含 UTF8 内容的缓冲区,你可以使用 Buffer.from(a).toString("utf8"):

let a = Buffer.from("AEEAQgBDAGEAYgBj", "base64").swap16().toString("utf16le");
console.log(a.length);
// 6
console.log(a);
// ABCabc
let b = Buffer.from(a); // (Default is `"utf8"` but you could supply that explicitly)
console.log(b);
// <Buffer 41 42 43 61 62 63>