NodeJS UTF8编码缓冲区然后解码UTF8字符串产生具有不同内容的缓冲区

时间:2015-02-11 18:37:21

标签: javascript node.js buffer

我将其输入nodejs控制台

new Buffer(new Buffer([0xde]).toString('utf8'), 'utf8')

并打印出来

<Buffer ef bf bd>

查看docs后 看来这会产生相同的缓冲区。我正在从缓冲区创建一个utf8编码的字符串,其内容由一个字节(0xde)组成,然后使用该utf8编码的字符串来创建缓冲区。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

对于可以是多字节的编码,您不能期望在所有情况下获得与您开始时相同的字节。在UTF-8的情况下,某些字符需要正确表示多个字节。

在您的示例中,0xde超过0x7f,这是可由单个字节表示的字符的最大值。因此,当您再调用.toString('utf8')时,节点会看到它只有一个字节,而是返回UTF-8字符\uFFFD(十六进制为0xef, 0xbf, 0xbd),用于表示未知/不可表示字符。然后将这个“替换字符”值读回新缓冲区是没有问题的,因为它是一个有效的UTF-8字符。