【问题标题】:How to get a UTF8 encoded string from a Base64 encoded string in Javascript?如何从 Javascript 中的 Base64 编码字符串中获取 UTF8 编码字符串?
【发布时间】:2021-09-22 06:43:43
【问题描述】:

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

【问题讨论】:

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


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-05
      • 2012-12-28
      • 2010-09-19
      • 2011-10-31
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      相关资源
      最近更新 更多