如何在Javascript中从Base64编码的字符串中获得UTF8编码的字符串



AEEAQgBDAGEAYgBjABCabc的Base64,但是当我运行此代码时:

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

控制台中的打印结果是CCD_ 3,它是UTF16(LE(。

我假设,由于我从UTF8编码的字符串创建Buffer,结果将是<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>

最新更新