将缓冲区从base64编码转换为utf8编码node.js

14

我的应用程序会导入Gmail的"Notes"文件夹中的所有邮件。我使用imap npm模块实现这个功能。

参照他们Github页面上的示例,我将每封邮件的所有内容都读入缓冲区:

 stream.on('data', function(chunk) {
     count += chunk.length;
     buffer += chunk.toString('utf8');
 });

然而,我得到的是像这样的句子

  0KHQvdCw0YfQsNC70LAg0YHQvtC30LTQsNC10YLRgdGPINGA0LXRiNC10YLQutCwINC/0YDQvtGB 0YLRgNCw0L3RgdGC0LLQsCDQstC+0L7QsdGA0LDQttC10L3QuNGPLiZuYnNwOzxkaXY+PGJyPjwv ZGl2PjxkaXY+0JfQsNGC0LXQvCDQvdCwI

(从俄语进行错误转换)

我发现这些是Base64编码的文本片段,为了阅读它们,我需要将其从Base64转换为utf8。

有时还会出现令人讨厌的=字符,它似乎出现得无处不在...

 letting them f= all on her shoulders

你知道我如何解决这两个问题吗?

谢谢!


3
为了将base64转换为utf8,您可以使用(new Buffer(original, 'base64')).toString('utf8')。您能否提供有关“=”问题的更多细节? - jabclab
@jabclab 这个方法可以用,但只适用于仅包含俄语的缓冲区。如果有一个缓冲区只包含英文或英文和俄文,它会产生乱码。我想在转换之前运行一些脚本来识别编码,对吗? - Aerodynamika
@jabclab 关于 = 问题 - 由于某种原因,有时候等号符号会随机插入到文本中。我似乎找不到它确切出现的位置...谢谢! - Aerodynamika
@jabclab,你能否把它作为答案发布,因为这对我非常有效吗? - Aerodynamika
2个回答

37

new Buffer(...) 已经过时一段时间了,请使用 Buffer.from(...)

一个简单的例子可能是:

var utf8encoded = Buffer.from(base64encoded, 'base64').toString('utf8');

只有当base64encoded是字符串时才有效。如果它已经是缓冲区,那么你得到的编码值与输入的相同。我发现的唯一方法是将已编码的缓冲区转储到base64中,然后将其读回到Buffer.from()中,并将其作为纯文本字符串最终转储出来。 - Sloloem

25

要将base64编码的String转换为utf8格式,您可以使用以下代码:

var base64encoded = '0KHQvdCw0YfQsNC70LAg0YHQvtC30LTQsNC10YLRgdGPINGA0LXRiNC10YLQutCwINC/0YDQvtGB 0YLRgNCw0L3RgdGC0LLQsCDQstC+0L7QsdGA0LDQttC10L3QuNGPLiZuYnNwOzxkaXY+PGJyPjwv ZGl2PjxkaXY+0JfQsNGC0LXQvCDQvdCwI';

var utf8encoded = (new Buffer(base64encoded, 'base64')).toString('utf8');

2
new Buffer()已被声明为不稳定(Stability:0),请参考mido的答案 - Dominik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接