Node.js缓冲区编码问题

5

我在理解node.js中的字符编码方面遇到了困难。 我正在传输数据,但由于编码的原因,某些字符会被替换为其他字符。我的做法是在客户端进行base 64编码,然后在node.js中进行解码。

为了简化问题,我将其缩小到这段代码:

new Buffer("1w==", 'base64').toString('utf8');
1w==×字符的base64编码。当使用'base64'参数将该字符串传递给缓冲区并执行.toString('utf8')时,我期望能得到同样的字符,但实际上却没有。取而代之的是(字符代码65533)。
是否utf8编码有误?如果是,应该使用什么替代?如果不是,如何在node.js中解码base64字符串?
2个回答

4

不,你的假设是错误的。显然,base64编码的字符串只有一个字节被编码。所有Unicode代码点在U+007F以上的字符至少需要两个字节才能在UTF-8中进行编码。

我还不太擅长心算解码base64,但可以尝试使用ISO-8859-1。

重点是,base64解码将字符串转换为字节串。你假设它解码为一个字符串,但这是错误的。你仍然需要将字节串编码为字符串,在你的情况下,正确的编码是ISO-8859-1。


我将编码从utf8更改为只使用单字节的binary。文档显示这是一个已弃用的功能,但目前它可以工作。谢谢。 - pimvdb

0
echo -n x | base64

提供

eA==

如果编码正确,给定的代码将会得到预期的答案。问题很可能在编码方面。(1w== 转换为字节0xD7,这将是一个多字节UTF-8字符的开头)

当被解释为ISO 8859-1时,字节序列\0xD7变成字符序列U+00D7,即×,就像问题中的那样。不要因为看起来相似而混淆了x。这里有一个区别:×x×x×x×x - Roland Illig

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