Javascript atob如何做到';是否使用base64从缓冲区转换?

Javascript atob如何做到';是否使用base64从缓冲区转换?,javascript,node.js,Javascript,Node.js,我有我用软件包加密的数据 我还将结果转换为base64,并使用atob()函数从base64转换 问题是没有按预期工作,而是Buffer.from(b64,'base64').toString()可以 为什么??我该如何解决这个问题?我需要在客户端使用atob(浏览器中不存在缓冲区) 使用decodeURIComponent和escape转换为UTF-8 const non64 = decodeURIComponent(escape(window.atob( b64 ))); 如果LZ库支持,

我有我用软件包加密的数据

我还将结果转换为base64,并使用
atob()
函数从base64转换

问题是没有按预期工作,而是
Buffer.from(b64,'base64').toString()可以

为什么??我该如何解决这个问题?我需要在客户端使用
atob
(浏览器中不存在缓冲区)


使用
decodeURIComponent
escape
转换为UTF-8

const non64 = decodeURIComponent(escape(window.atob( b64 )));
如果LZ库支持,则更有效的选项(见下文)是不将base64编码的缓冲区解释为字符串,并将其作为Uint8Array直接传递给库。你可以用它来做

const buffer = Uint8Array.from(atob(b64), c => c.charCodeAt(0))
然后,如果你真的需要一个字符串,你可以使用一个文本解码器,这比Shlomi公认的非常好的解决方案要简单一些:

const text = new TextDecoder().decode(buffer)

使用TypedArray更有效的原因有两个,LZ的实现应该真正使用它们而不是字符串(可能使用WebAssembly)。显然,您跳过了UTF-8解码,但更重要的原因是,在JavaScript中,字符串在内存中表示为UTF-16,因此每个字符至少占用2个字节(对于二进制字符串,正好是2个字节),而Uint8Array——顾名思义——每项仅使用一个字节。

您所说的是什么“未按预期工作”?atob应该从base64转换回..但当您运行我的示例时,它没有这样做。至少没有使用正确的字符。
atob
确实从base64转换,我已经经常使用它,但它不会将输入解释为UTF-8,这与
Buffer.toString()
不同。