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

时间:2021-07-13 07:55:02

标签: javascript node.js utf-8 base64 utf-16

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 编码字符串?

1 个答案:

答案 0 :(得分:1)

问题在于您的原始数据是 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>
相关问题