如何从Javascript中的Base64编码字符串中获取UTF8编码字符串?
How to get a UTF8 encoded string from a Base64 encoded string in Javascript?
AEEAQgBDAGEAYgBj
是 ABCabc
的 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>
AEEAQgBDAGEAYgBj
是 ABCabc
的 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>