Node.js 节点中的缓冲区

Node.js 节点中的缓冲区,node.js,byte,Node.js,Byte,考虑以下节点代码 const bufA = Buffer.from('tést'); 布法: 为什么输入中的四个字符被转换为5个十六进制字节?当您从(字符串)调用缓冲区时,会发生以下几种情况: 编码默认为utf-8 JS字符串内部存储为UCS-2字符数组,编码为UTF-8 在UTF-8中,é是一个多字节字符,就像拉丁语脚本中的大多数重音字符一样。以下是有关字符在不同系统中编码方式的更多信息: 如您所见,此字符的UTF-8表示形式为0xC3 0xA9,它对应于缓冲区中的第二个和第三个字节c

考虑以下节点代码

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


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

当您从(字符串)调用
缓冲区时,会发生以下几种情况:

  • 编码默认为
    utf-8
  • JS字符串内部存储为UCS-2字符数组,编码为UTF-8
在UTF-8中,
é
是一个多字节字符,就像拉丁语脚本中的大多数重音字符一样。以下是有关字符在不同系统中编码方式的更多信息:

如您所见,此字符的UTF-8表示形式为
0xC3 0xA9
,它对应于缓冲区中的第二个和第三个字节
c3 a9

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

let result='';
stream.on('data',函数(buf){
//BUG!不考虑多字节字符。
结果+=buf.toString();
});
几乎总是错误的-除非流已经设置为处理编码本身(然后,读取时将得到字符串,而不是缓冲区)