首页 > 解决方案 > 节点中的缓冲区

问题描述

考虑遵循节点代码

const bufA = Buffer.from('tést');

缓冲区:

<缓冲器 74 c3 a9 73 74>

为什么将输入中的四个字符转换为 5 个十六进制字节?

标签: node.jsbyte

解决方案


当你打电话时Buffer.from(string),会发生几件事:

  • 编码默认为utf-8
  • JS 字符串,内部存储为 UCS-2 字符数组,编码为 UTF-8

在 UTF-8 中,é是一个多字节字符,就像拉丁文字中的大多数重音字符一样。以下是有关字符在不同系统中如何编码的更多信息:https ://www.fileformat.info/info/unicode/char/e9/index.htm

如您所见,该字符的 UTF-8 表示形式是0xC3 0xA9,它对应c3 a9于 Buffer 中的第二个和第三个字节。

这也意味着,在解码缓冲区时(例如,当连接来自流的数据时),一些字符可能会落在缓冲区边界上,并且可能无法解码字符串,直到您拥有字符的其余部分(0xC3 本身将是无效的)。这就是为什么您在 Web 上找到的代码示例:

let result = '';
stream.on('data', function(buf) {
  // BUG! Does not account for multi-byte characters.
  result += buf.toString();
});

几乎总是错误的 - 除非 Stream 已经设置为处理编码本身(然后,在读取时你会得到字符串,而不是缓冲区)。


推荐阅读